Android中Enum(枚舉)的使用


簡介

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM