Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開銷的方法
Java5以后開始支持枚舉類型,枚舉類型使用起來非常方便,其重要的作用是作為類型安全使用的。如果在不考慮系統(tǒng)內(nèi)存開銷的情況下大量的使用枚舉也不會有什么問題。但是移動端還是需要注意的。
android系統(tǒng)在應(yīng)用啟動后會給應(yīng)用單獨(dú)分配一塊內(nèi)存。應(yīng)用的dex code、heap以及運(yùn)行時的內(nèi)存分配都會在這塊內(nèi)存中。而使用枚舉類型的dex size是普通常亮的13倍以上。在運(yùn)行時的內(nèi)存分配,一個enum的聲明至少要消耗掉20個bytes。從這兩點(diǎn)就可以說明,在app中大量使用枚舉的內(nèi)存開銷是非常大的。
枚舉最大的優(yōu)勢是類型安全。那么是不是又辦法在不使用枚舉的情況下做到類型安全呢?答案是肯定的,下面看看怎么干。
goodle官方很早就發(fā)現(xiàn)了枚舉對android系統(tǒng)帶來的性能開銷,所以在其官網(wǎng)上就已經(jīng)提醒了開發(fā)者盡量少的使用枚舉,而且還提供了注解的方式來檢查類型安全。目前其提供了int和string兩種注解方式。分別是:IntDef和StringDef。
話不多說,直接上例子。ps:demo里面有詳細(xì)的注釋。
一、Int類型注解檢查類型安全
package com.yw.enumproxylib; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import androidx.annotation.IntDef; /** * 定義一個int類型的注解 * 用注解代替枚舉,做到類型安全 * create by yangwei * on 2020-01-30 21:34 */ public class EnumProxy { public static final int READ_CAR = 0;//紅色的汽車 public static final int GREEN_CAR = 1;//綠色的汽車 public static final int YELLOW_CAR = 2;//黃色的汽車 @IntDef({READ_CAR, GREEN_CAR, YELLOW_CAR}) @Retention(RetentionPolicy.SOURCE)//源碼級別 public @interface CAR_Enum { } /** * 獲取汽車類型 * * @param car * @return */ public static int getCar(@CAR_Enum int car) { switch (car) { case READ_CAR: return 0; case GREEN_CAR: return 1; case YELLOW_CAR: return 2; } return -1; } }
二、String類型注解檢查類型安全
package com.yw.enumproxylib; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import androidx.annotation.StringDef; /** * 定義一個string類型的注解,用于檢查星期的類型安全。 * create by yangwei * on 2020-01-30 22:04 week */ public class StringEnum { public static final String MONDAY = "monday"; public static final String TUESDAY = "tuesday"; public static final String WENDESDAY = "wendesday"; public static final String THURSDAY = "thursday"; public static final String FRIDAY = "friday"; public static final String SATURDAY = "saturday"; public static final String WEEKDAY = "weekday"; @StringDef({MONDAY, TUESDAY, WENDESDAY, THURSDAY, FRIDAY, SATURDAY, WEEKDAY})//此處定義注解的值只能是這幾個 @Retention(RetentionPolicy.SOURCE)//編譯時注解,源碼級檢查 public @interface Week { } /** * 獲取日期 * * @param week * @return */ public static String getWeek(@Week String week) { switch (week) { case MONDAY: return "星期一"; case TUESDAY: return "星期二"; case WENDESDAY: return "星期三"; case THURSDAY: return "星期四"; case FRIDAY: return "星期五"; case SATURDAY: return "星期六"; case WEEKDAY: return "星期日"; } return null; } }
三、用來檢查類型安全的MainActivity,從下面可以看到,當(dāng)使用EnumProxy.getCar輸入?yún)?shù)的時候,如果直接輸入一個整數(shù)則編譯不通過。當(dāng)輸入我們定義的EnumProxy.GREEN_CAR編譯才通過。
同理StringEnum也能檢查類型安全。
package com.yw.enumproxy; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.yw.enumproxylib.EnumProxy; import com.yw.enumproxylib.StringEnum; /** * 測試?yán)? */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int car_black = 10; int bk = EnumProxy.getCar(car_black);//此處類型檢查不通過 int ck = EnumProxy.getCar(EnumProxy.GREEN_CAR);//類型檢查通過 String str = "friday"; String week1 = StringEnum.getWeek(str);//直接賦值String時類型檢查不通過 String week2 = StringEnum.getWeek(StringEnum.FRIDAY);//賦值定義好的值時類型檢查通過 } }
以上知識點(diǎn)如果大家在學(xué)習(xí)的時候有任何疑問可以聯(lián)系腳本之家小編補(bǔ)充分享。
相關(guān)文章
Kotlin中的handler如何避免內(nèi)存泄漏詳解
Handler,我們已經(jīng)相當(dāng)熟悉了,而且經(jīng)常用得不亦樂乎,但就是因?yàn)樘煜ち耍艜紶柋凰赐币坏?,血流不止,下面這篇文章主要給大家介紹了關(guān)于Kotlin中handler如何避免內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下。2017-12-12Android SharedPreferences實(shí)現(xiàn)記住密碼和自動登錄
這篇文章主要為大家詳細(xì)介紹了Android SharedPreferences實(shí)現(xiàn)記住密碼和自動登錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05Android實(shí)現(xiàn)圖片加載進(jìn)度提示
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片加載進(jìn)度提示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06Android自定義View實(shí)現(xiàn)黑客帝國數(shù)字雨效果
這篇文章主要給大家介紹了關(guān)于Android自定義View實(shí)現(xiàn)黑客帝國數(shù)字雨效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Android UI控件之ProgressBar進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android UI控件之ProgressBar進(jìn)度條的實(shí)現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Flutter 自定義Drawer 滑出位置的大小實(shí)例代碼詳解
這篇文章主要介紹了Flutter 自定義Drawer 滑出位置的大小,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04