天天看點

Android開發中使用注解替代枚舉類

如果你的項目在做記憶體優化,那麼請嘗試用注解替代枚舉!!!

枚舉 在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 {
 
    }
}
           

注解的這種方式可以修飾成員變量/方法參數等,可以用作參數,也可用于限定範圍

繼續閱讀