簡介
enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
創建枚舉類型要使用 enum 關鍵字,隱含了所創建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。枚舉類型符合通用模式 Class Enum<E extends Enum<E>>
,而 E
表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal)
構造函數中,在這里,每個值的名稱都被轉換成一個字符串,並且序數設置表示了此設置被創建的順序。
Android官網不建議使用enums,占用內存多(Enums often require more than twice as much memory as static constants.)。
Android中當你的App啟動后系統會給App單獨分配一塊內存。App的DEX code、Heap以及運行時的內存分配都會在這塊內存中。
用法一:常量
package com.why.project.androidcnblogsdemo.enumtype; /** * Created by HaiyuKing * Used 存儲位置類型 */ public enum TypeEnum { CACHE,//緩存存儲 FILE;//文件存儲 }
package com.why.project.androidcnblogsdemo.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.why.project.androidcnblogsdemo.R; import com.why.project.androidcnblogsdemo.enumtype.IConstants; import com.why.project.androidcnblogsdemo.enumtype.LanguageEnum; import com.why.project.androidcnblogsdemo.enumtype.TypeEnum; /** * Created by HaiyuKing * Used 枚舉類測試 */ public class EnumActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_enum); Log.d("EnumActivity","TypeEnum.CACHE=" + TypeEnum.CACHE);//TypeEnum.CACHE=CACHE
//對於無構造函數的枚舉類的一般使用 TypeEnum typeEnum = TypeEnum.CACHE; createPath(typeEnum); } private void createPath(TypeEnum createPath){ if(createPath == TypeEnum.CACHE){ Log.d("EnumActivity","創建緩存目錄"); }else{ Log.d("EnumActivity","創建文件目錄"); } } }
用法二:給 enum 自定義屬性和方法
package com.why.project.androidcnblogsdemo.enumtype; /** * 語種類型 */ public enum LanguageEnum { LANGUAGE("language"),//語言,用於SharedPreferences存儲的Key值 LANGUAGE_zh("zh"),//中文,用於SharedPreferences存儲的Value值 LANGUAGE_en("en"), //英語 LANGUAGE_es("es"),//西語 LANGUAGE_fr("fr"),//法語 LANGUAGE_ar("ar"),//阿語 LANGUAGE_ru("ru");//俄語 private String language;//自定義屬性 /**構造函數,枚舉類型只能為私有*/ LanguageEnum(String language) { this.language = language; } //自定義方法 public String getLanguage(){ return language; } }
package com.why.project.androidcnblogsdemo.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.why.project.androidcnblogsdemo.R; import com.why.project.androidcnblogsdemo.enumtype.IConstants; import com.why.project.androidcnblogsdemo.enumtype.LanguageEnum; import com.why.project.androidcnblogsdemo.enumtype.TypeEnum; /** * Created by HaiyuKing * Used 枚舉類測試 */ public class EnumActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_enum); Log.d("EnumActivity","LanguageEnum.LANGUAGE_zh.getLanguage()=" + LanguageEnum.LANGUAGE_zh.getLanguage());//LanguageEnum.LANGUAGE_zh.getLanguage()=zh } }
替代方案
接口變量
因為接口會自動將成員變量設置為靜態的(static)、不可變的(final),這一點可以防止某些情況下錯誤地添加新的常量。這也使得代碼看起來更簡單和清晰。 同時,一個的簡單測試顯示,同樣的接口(字節碼文件)占用的空間是209個字節左右,而類(字節碼文件)占用的空間是366個字節左右。更少的字節碼文件意味着加載和維護的成本更低。此外,JVM 加載接口的時候,不需要擔心類提供的額外特征(如重載、方法的動態綁定等),因此加載更快。
package com.why.project.androidcnblogsdemo.enumtype; /** * Created by HaiyuKing * Used */ public interface IConstants { //接口會自動將成員變量設置為靜態的(static)、不可變的(final) String LANGUAGE = "language"; String LANGUAGE_zh = "zh"; String LANGUAGE_en = "en"; String LANGUAGE_es = "es"; String LANGUAGE_fr = "fr"; String LANGUAGE_ar = "ar"; String LANGUAGE_ru = "ru"; }
package com.why.project.androidcnblogsdemo.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.why.project.androidcnblogsdemo.R; import com.why.project.androidcnblogsdemo.enumtype.IConstants; import com.why.project.androidcnblogsdemo.enumtype.LanguageEnum; import com.why.project.androidcnblogsdemo.enumtype.TypeEnum; /** * Created by HaiyuKing * Used 枚舉類測試 */ public class EnumActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_enum); Log.d("EnumActivity","IConstants.LANGUAGE_zh=" + IConstants.LANGUAGE_zh);//IConstants.LANGUAGE_zh=zh } }
參考資料