枚舉是什么温鸽?
直接上代碼:
首先我們創(chuàng)建一個枚舉類型的文件肥哎,命名為ColorEnum葫笼。
public enum ColorEnum{
RED,
GREEN,
YELLOW
}
然后創(chuàng)建一個Pen類屹逛,假設Pen類有個屬性為Color础废,見下面
class Pen {
private ColorEnum color;
//其它屬性忽略
void setColor(ColorEnum color) {
this.color = color;
}
ColorEnum getColor() {
return color;
}
}
在主類中為Pen的對象賦值并獲取Color屬性:
public class Main {
public static void main(String args[]) {
Pen pen = new Pen();
pen.setColor(ColorEnum.RED);
System.out.println(pen.getColor());
}
}
這就是java1.5之后引入的的枚舉的一種應用。它主要用于取代使用常量枚舉的方式罕模,即下面所示方式:
public class Main {
public static final int COLOR_RED = 0;
public static final int COLOR_GREEN =1;
public static final int COLOR_BLUE = 2;
public static void main(String args[]) {
Pen pen = new Pen();
pen.setColor(COLOR_RED);
System.out.println(pen.getColor());
}
}
使用枚舉類型可以提高代碼的安全性(防止輸入枚舉之外的值)和可讀性(在打印日志時)评腺。另外注意兩個點:上述的ColorEnum實質(zhì)上會在編譯時轉(zhuǎn)換成繼承java.lang.enum的類,所以ColorEnum不可繼承自其它的類淑掌。此外蒿讥,被編譯后的ColorEnum會被標記為final,即不可被繼承抛腕。
在枚舉類型中有一個方法values()芋绸,用于以數(shù)組方式將枚舉類型中的所有選項獲取出來。
在switch中的應用
仍然以上面的例子講述担敌。枚舉配合switch使用可以使得我們的代碼規(guī)范性和美觀性增加不少摔敛。具體見下:
public class Main {
public static void main(String args[]) {
Pen pen = new Pen();
pen.setColor(ColorEnum.RED);
switch(pen.getColor()){
case GREEN:
System.out.println("GREEN");
break;
case RED:
System.out.println("RED");
break;
case YELLOW:
System.out.println("YELLOW");
break;
}
}
}
Android中性能與枚舉類型的沖突
看到這么優(yōu)秀的工具有些人迫不及待地想要在自己的Android代碼中使用它了。先別急著使用柄错,由于android的性能問題舷夺,java枚舉類型在Android并不是那么適用了苦酱!先看看官方給出的答案:
Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.
上面的意思是:枚舉類型需要兩倍于靜態(tài)常量的內(nèi)存售貌,不要在android中使用枚舉類型!在使用枚舉后會使編譯后的dex增大許多疫萤,另外還會占據(jù)額外的運行內(nèi)存颂跨,所以傳統(tǒng)的枚舉類型不可在android中使用。
Android中使用枚舉的姿勢
但是由于枚舉的優(yōu)秀性扯饶,我們還是有在Android中使用枚舉的價值的恒削。為了解決這個問題池颈,Android官方引入了兩個注解,分別是StringDef和IntDef钓丰。具體方法見下:
首先引入依賴:
compile 'com.android.support:support-annotations:22.0.0'
使用注解聲明枚舉類型(關于注解部分知識可以參照樓主之前的博客):
@IntDef({RED, GREEN, YELLOW})
@Retention(RetentionPolicy.SOURCE)
public @interface ColorEnum {
}
然后再次聲明Pen類:
class Pen{
@ColorEnum
private int color;
@ColorEnum
public int getColor(){
return color;
}
public void setColor(@ColorEnum int color){
this.color = color;
}
}
在主方法調(diào)用:
public static final int MALE = 0;
public static final int FEMALE = 1;
Pen pen = new Pen();
pen.setColor(MALE);
當你為pen的color屬性隨便給一個int值時躯砰,IDE會報錯。但僅限于IDE報錯携丁,程序仍然可以運行琢歇。比如:
pen.setColor(2);
上述代碼會有紅色下劃線并且警告,但是程序可以編譯運行梦鉴,這是由于RetentionPolicy.SOURCE使得注解是在源碼階段生效的李茫,從而只有IDE代碼檢查工具會去判斷是否正確。
總結(jié)
在java中使用枚舉是一種有價值的規(guī)范代碼的方式肥橙,但是在安卓中就得根據(jù)時機選擇是否使用了魄宏。一般情況下如果只是簡單的幾個枚舉量使用注解來進行枚舉的必要性并不大。切記不要直接在Android中使用枚舉類型存筏!