如果你的項目在做記憶體優化,那麼請嘗試用注解替代枚舉!!!
枚舉 在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 {
}
}
注解的這種方式可以修飾成員變量/方法參數等,可以用作參數,也可用于限定範圍