如果你的項目在做內存優化,那麼請嘗試用註解替代枚舉!!!
枚舉 在Android開發中通常用於 範圍限制和類型安全,可讀性比較好。但是基於枚舉的原理,它佔用的內存過多,因此不推薦使用。
爲什麼枚舉佔用內存更高?
舉個例子:
public enum Numbers {
One,
Two,
Three;
}
這段代碼等效的java代碼如下:
public final class Numbers extends Enum
{
public static Numbers[] values()
{
return (Numbers[])$VALUES.clone();
}
public static Numbers valueOf(String name)
{
return (Numbers)Enum.valueOf(com/brycegao/test/Numbers, name);
}
private Numbers(String s, int i)
{
super(s, i);
}
public static final Numbers One;
public static final Numbers Two;
public static final Numbers Three;
private static final Numbers $VALUES[];
static
{
One = new Numbers("One", 0);
Two = new Numbers("Two", 1);
Three = new Numbers("Three", 2);
$VALUES = (new Numbers[] {
One, Two, Three
});
}
}
從代碼中可知:枚舉值是類對象,而且是靜態常量,而一個對象佔至少16字節,3個對象就是16✖️3。而如果寫成靜態常量的形式,就是4✖️3。
使用註解@IntDef和@StringDef
public class Numbers {
public static final int ONE = 1;
public static final int TWO = 2;
public static final int THREE = 3;
public static final String STR_ONE = "ONE";
public static final String STR_TWO = "TWO";
public static final String STR_THREE = "THREE";
@IntDef({ONE, TWO, THREE})
@Retention(RetentionPolicy.SOURCE)
public @interface NumbersInt {
}
@StringDef({STR_ONE, STR_TWO, STR_THREE})
@Retention(RetentionPolicy.SOURCE)
public @interface NumbersString {
}
}
註解的這種方式可以修飾成員變量/方法參數等,可以用作參數,也可用於限定範圍