關于java枚舉和Android使用枚舉的一些小姿勢

laisun 8年前發布 | 9K 次閱讀 Java 安卓開發 Android開發 移動開發

枚舉是什么?

直接上代碼:

首先我們創建一個枚舉類型的文件,命名為ColorEnum。

public enum ColorEnum{
    RED,
    GREEN,
    YELLOW
}

然后創建一個Pen類,假設Pen類有個屬性為Color,見下面

class Pen {
    private ColorEnum color;
    //其它屬性忽略

void setColor(ColorEnum color) {
    this.color = color;
}

ColorEnum getColor() {
    return color;
}

}</code></pre>

在主類中為Pen的對象賦值并獲取Color屬性:

public class Main {

public static void main(String args[]) {
    Pen pen = new Pen();
    pen.setColor(ColorEnum.RED);
    System.out.println(pen.getColor());
}

}</code></pre>

這就是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());
}

}</code></pre>

使用枚舉類型可以提高代碼的安全性(防止輸入枚舉之外的值)和可讀性(在打印日志時)。另外注意兩個點:上述的ColorEnum實質上會在編譯時轉換成繼承java.lang.enum的類,所以ColorEnum 不可繼承自其它的類 。此外,被編譯后的ColorEnum會被標記為final,即不可 被繼承

在枚舉類型中有一個方法values(),用于以數組方式將枚舉類型中的所有選項獲取出來。

在switch中的應用

仍然以上面的例子講述。枚舉配合switch使用可以使得我們的代碼規范性和美觀性增加不少。具體見下:

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;
        }

}

}</code></pre>

Android中性能與枚舉類型的沖突

看到這么優秀的工具有些人迫不及待地想要在自己的Android代碼中使用它了。先別急著使用,由于android的性能問題,java枚舉類型在Android并不是那么適用了!先看看官方給出的答案:

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

上面的意思是:枚舉類型需要兩倍于靜態常量的內存,不要在android中使用枚舉類型!在使用枚舉后會使編譯后的dex增大許多,另外還會占據額外的運行內存,所以傳統的枚舉類型不可在android中使用。

Android中使用枚舉的姿勢

但是由于枚舉的優秀性,我們還是有在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;
}

}</code></pre>

在主方法調用:

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代碼檢查工具會去判斷是否正確。

總結

在java中使用枚舉是一種有價值的規范代碼的方式,但是在安卓中就得根據時機選擇是否使用了。一般情況下如果只是簡單的幾個枚舉量使用注解來進行枚舉的必要性并不大。切記不要直接在Android中使用枚舉類型!

 

來自:http://www.jianshu.com/p/118afe1cf628

 

 本文由用戶 laisun 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!