標籤:特性 字串 枚舉類型 rri 成本 並且 content 一個 state
簡介
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 }}
參考資料
java enum(枚舉)使用詳解 + 總結
Java enum的用法詳解
Android中是否推薦使用枚舉Enum
Android中Enum(枚舉)的使用