在Android開發(fā)中鞍陨,我們經(jīng)常需要定義一些限定范圍的常量,通常我們會將這個范圍取值定義為靜態(tài)常量:
public class Constants {
public static final int SYSTEM_TYPE = 0;
public static final int TEXT_TYPE = 1;
public static final int IMG_TYPE = 2;
public static final int SOUND_TYPE = 3;
}
創(chuàng)建了一個setType方法从隆,該方法需要接收參數(shù)(參數(shù)范圍為這4種常量):
/**
* @param type 值為0:SYSTEM_TYPE, 1:TEXT_TYPE, 2:IMG_TYPE, 3:SOUND_TYPE
*/
public void setType(int type) {
//do some thing
}
這里有一個問題诚撵,就是調(diào)用setType的時候沒法限制其傳參范圍:
public void main(String[] args) {
setType(Constans.TEXT_TYPE);
setType(10); //不會報錯,編譯會通過键闺,但是沒有對應(yīng)的類型(10)來執(zhí)行相應(yīng)的邏輯
}
上面的setType方法沒法限制入?yún)⒎秶傺蹋绻@個方法被別人調(diào)用,就可能導(dǎo)致入?yún)㈠e誤的情況辛燥。
所以我們可以使用Enum枚舉來解決這個問題筛武,相信開發(fā)過Android的小伙伴們一定對Enum(枚舉)不陌生吧缝其。
首先定義一個枚舉類:
public enum EnumType {
SYSTEM_TYPE,TEXT_TYPE,IMG_TYPE,SOUND_TYPE;
}
然后定義setType方法,入?yún)镋numType類型:
public void setType(EnumType type){ // 入?yún)⒅荒転槊杜e類中定義的類型
//do some thing
}
最后調(diào)用setType方法:
public void main(String[] args) {
setType(EnumType.IMG_TYPE);
setType(10); //報錯
}
雖然這樣解決了入?yún)⒉幻鞔_的問題徘六,但是使用枚舉類内边,每一個枚舉值都是一個對象,在使用它時會增加額外的內(nèi)存消耗待锈。官方文檔也說明漠其,安卓開發(fā)應(yīng)避免使用Enum(枚舉類),因?yàn)橄啾扔陟o態(tài)常量竿音,Enum會花費(fèi)兩倍以上的內(nèi)存和屎。
那么我們該怎么辦才能既不使用Enum,又可以實(shí)現(xiàn)上面限制入?yún)⒌男Ч?
在Android中可以使用@IntDef/@StringDef+自定義注解來替代Enum的作用谍失。
首先自定義一個注解:
@IntDef({Type.SYSTEM_TYPE, Type.TEXT_TYPE, Type.IMG_TYPE, Type.SOUND_TYPE}) //限制入?yún)⒎秶?@Retention(RetentionPolicy.SOURCE) //設(shè)置注解保留級別為源碼階段
public @interface Type {
public static final int SYSTEM_TYPE = 0;
public static final int TEXT_TYPE = 1;
public static final int IMG_TYPE = 2;
public static final int SOUND_TYPE = 3;
}
定義setType方法眶俩,入?yún)⑷缦拢?/p>
private void setType(@Type int type) {
//do some thing
}
最后調(diào)用setType方法如下:
public void main(String[] args) {
setType(Type.SYSTEM_TYPE);
setType(0); //報錯
setType(10); //報錯
}
@StringDef同理,就不再贅述了