這篇文章忘記是在哪里看的了,所以沒有寫上出處
枚舉根據狀態獲取不同屬性及在Android開發中優先使用注解,慎用枚舉
public enum Status {
SUCCESS(1,"成功"),
FAIL(2,"失敗");
int mCode;
String mText;
Status(int i, String s) {
mCode=i;
mText=s;
}
public static Status getStatus(int i){
for (Status status:values()){
if (i==status.mCode){
return status;
}
}
return FAIL;
}
}
調用:
public static void main(String[] args) {
for (Status status:Status.values()){
System.out.println(status.mText);
}
}
輸出:
成功
失敗
Process finished with exit code 0
優先使用注解,慎用枚舉
- 原因
與靜態常量相比,枚舉會增大應用程序編譯后的 dex 文件,同時應用在運行時的內存占用也會升高。在資源有限的移動設備上,大量的使用枚舉無疑是致命的。
-
尋找替代方案
-
使用常量替換枚舉
public class StatusConstants { public static final int SUCCESS = 1; public static final int FAIL = 0; }
public static void main(String[] args) { doSth(StatusConstants.SUCCESS); doSth(StatusConstants.FAIL); } public static void doSth(int status){ switch (status){ case StatusConstants.SUCCESS: System.out.println("成功"); break; case StatusConstants.FAIL: System.out.println("失敗"); break; } }
? 上述代碼達到了和枚舉一樣的效果,完全可以不使用枚舉??墒牵屛以倩氐绞褂妹杜e的好處:
保證了類型安全:調用者無法隨意傳一個 int 值;
代碼可讀性非常高;
? 反過來對比看,向上面那樣使用常量會有什么問題:-
首先,我們無法保障類型安全,用戶可以在調用時傳入任何一個 int 值:
doSth(50);
其次代碼可讀性很差,IDE 只是提示傳入 int 類型的參數。此時如果不看方法體,調用者根本不知道該傳什么值。
-
-
接下來就要使用注解來解決這個問題了。
- 引入注解庫
compile 'com.android.support:support-annotations:25.0.0'
- 建立狀態注解
@Retention(RetentionPolicy.SOURCE) @Target(ElementType.PARAMETER) @IntDef({Status.SUCCESS, Status.FAIL}) public @interface Status { int SUCCESS = 1; int FAIL = 0; }
- 調用函數
public class StatusHelper { public static void doSth(@Status int status) { switch (status) { case Status.SUCCESS: System.out.println("成功"); break; case Status.FAIL: System.out.println("失敗"); break; } } }
- 測試:
public class Main { public static void main(String[] args) { doSth(Status.SUCCESS); doSth(Status.FAIL); doSth(155);//這里會顯示紅色錯誤 } }
雖然顯示紅色錯誤,但仍可以執行,不過這樣已經起到警告的作用了。