Enum 其本質就是一個特殊的Java類,有自己的構造器,成員變量,方法,同時也可以實現接口。Enum經過編譯器編譯后生成class文件,反編譯class 文件生成一個final類,該類繼承java.lang.Enum,所以enum是不能被繼承的。
由于枚舉的易用性與可讀性都非常好,所以受廣大開發者的推崇,但是也由于Enum的種種特性決定了它比較耗內存,所以谷歌也在內存管理的文檔中說明應該避免使用enum(原文:enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android)。
在不建議使用enum的同時,Google也同時推出了替代方案 使用 ** @IntDef **注解來定義枚舉,注解依賴庫 compile'com.android.support:support-annotations:2x.x.x' 不廢話,上代碼:
public class EnmuIntDefDemo extends Fragment {
//聲明常量
private static final int LEFT = 0;
private static final int TOP = 1;
private static final int RIGHT = 2;
private static final int BOTTOM = 3;
//聲明構造器
@IntDef({LEFT, TOP, RIGHT, BOTTOM})
@Retention(RetentionPolicy.SOURCE)//聲明所定義枚舉的策略,有三種類型,后面細說。
public @interface AlignParentSlid{}
//用了聲明變量
@AlignParentSlid int mParentSlid;
//聲明參數
public void setParentSlid(@AlignParentSlid int parentSlide){
}
//聲明返回值
@AlignParentSlid
public int getParentSlid(){
return LEFT;
}
}
定義的枚舉可以聲明在變量,參數,返回值上,不多解釋了,對聲明的策略做一簡單解析:
@Retention(RetentionPolicy.SOURCE)
共有三種策略:
RetentionPolicy.SOURCE
這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略(什么意思?就是該策略下傳值錯誤編譯器會報錯但是不影響運行)
RetentionPolicy.CLASS
注解保留在.class文件中,在加載到JVM虛擬機時丟棄(該策略下傳值錯誤編譯無法通過)
RetentionPolicy.RUNTIME
注解保留在程序運行期間,此時可以通過反射獲得定義在某個類上的所有注解。