使用Enum的正確姿勢(shì)

前言

看到目前項(xiàng)目里用到蠻多枚舉, 才有了這篇小文章分享

為什么使用Enum

java中的Enum是包含固定常量集的數(shù)據(jù)類型.當(dāng)我們需要預(yù)定義一組代表某種數(shù)據(jù)的值時(shí)一般都會(huì)使用枚舉, 而當(dāng)要保證類型安全時(shí), 我們經(jīng)常會(huì)使用Enum。

比如, 當(dāng)我們要保證常量使用正常時(shí), 我們經(jīng)常使用Enum在編譯時(shí)校驗(yàn)確保類型安全

使用Enum的缺點(diǎn)

Android開(kāi)發(fā)者官網(wǎng)上, 有這樣一段話

enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.

Enum中的每個(gè)值都是一個(gè)對(duì)象,每個(gè)聲明都將使用一些運(yùn)行時(shí)內(nèi)存來(lái)簡(jiǎn)單引用該對(duì)象,所以Enum相較于static int會(huì)占用更多的內(nèi)存.

另外添加單個(gè)Enum將增加最終DEX文件的大小(是static int的13倍).

解決方案

Google提供了注解庫(kù)通過(guò)Typedef協(xié)助我們解決了Enum的問(wèn)題,它可以確保特定參數(shù), 返回值或字段引用特定的常量集,還可以完成代碼以自動(dòng)提供允許的常量.

我們可以通過(guò)使用@IntDef和@StringDef來(lái)幫助我們?cè)诰幾g時(shí)檢查像Enum這項(xiàng)的變量賦值.

使用姿勢(shì)

  1. 首先我們需要依賴注解庫(kù)

dependencies {compile 'com.android.support:support-annotations:24.2.0'}

  1. 直接上代碼了, 因?yàn)檫€是蠻簡(jiǎn)單的

public class Person {

public static final int MALE = 0;

public static final int FEMALE = 1;

private  int sex;

public String getSexValue(){

if(MALE == sex){

return "男";

}else if(FEMALE == sex){

return "女";

}

return "";

}

public void setSex(@sexDef int sex) {

this.sex = sex;

}

//  定義該注解被保留的時(shí)間長(zhǎng)短

//  RetentionPolicy.CLASS      注解被保留到class文件, 但jvm加載class文件時(shí)候被遺棄, 這是默認(rèn)生命周期; 用于在編譯時(shí)進(jìn)行一些預(yù)處理操作, 比如生成一些輔助代碼(ButterKnife)

//  RetentionPolicy.RUNTIME    注解不僅被保存到class文件中, jvm加載class文件之后, 仍然存在;用于在運(yùn)行時(shí)去動(dòng)態(tài)獲取注解信息

//  RetentionPolicy.SOURCE      注解只保留在源文件, 當(dāng)Java文件編譯成class文件的時(shí)候, 注解被遺棄; 用于做一些檢查性操作

@Retention(RetentionPolicy.SOURCE)

//  使用@IntDef定義聲明常量作為枚舉

@IntDef({MALE, FEMALE})

//  使用@interface聲明新的枚舉注解類型

public @interface sexDef{}

}

  1. 當(dāng)我們調(diào)用setSex設(shè)置性別的時(shí)候, 如果輸入非指定類型, 則編譯不會(huì)通過(guò)

總結(jié)

與普通static常量相比, Enum的使用至少為整個(gè)apk添加至少兩倍以上的字節(jié)數(shù),并且使用5到10倍的RAM內(nèi)存。所以建議盡量避免使用Enum, 當(dāng)需要使用上述特性時(shí),建議以@IntDef 或 @StringDef 替代使用。

更多的可以看看The price of ENUMs視頻, 需科學(xué)上網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容