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)文章
基于Android設(shè)計(jì)模式之--SDK源碼之策略模式的詳解
本篇文章介紹了,基于Android設(shè)計(jì)模式之--SDK源碼之策略模式的詳解。需要的朋友參考下2013-04-04
Eclipse新建Android項(xiàng)目報錯解決方案詳細(xì)匯總
這篇文章主要介紹了Eclipse新建Android項(xiàng)目報錯解決方案詳細(xì)匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Android TextView的TextWatcher使用案例詳解
這篇文章主要介紹了Android TextView的TextWatcher使用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android程序開發(fā)通過HttpURLConnection上傳文件到服務(wù)器
這篇文章主要介紹了Android程序開發(fā)通過HttpURLConnection上傳文件到服務(wù)器的相關(guān)資料,需要的朋友可以參考下2016-01-01
android上一個可追蹤代碼具體到函數(shù)某行的日志類
追蹤代碼到函數(shù)具體某行,這樣的功能,是每一個程序員都希望會有的,因?yàn)樗梢詭椭覀冏粉櫟侥承写a的錯誤,接下來介紹下android上一個可追蹤代碼到函數(shù)具體某行的日志類,希望對開發(fā)者有所幫助2012-12-12
Android新建水平節(jié)點(diǎn)進(jìn)度條示例
這篇文章主要為大家介紹了Android新建水平節(jié)點(diǎn)進(jìn)度條示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

