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 {
 
    }
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章