枚舉根據狀態獲取不同屬性及在Android開發中優先使用注解替代枚舉

這篇文章忘記是在哪里看的了,所以沒有寫上出處

枚舉根據狀態獲取不同屬性及在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

優先使用注解,慎用枚舉

  1. 原因

與靜態常量相比,枚舉會增大應用程序編譯后的 dex 文件,同時應用在運行時的內存占用也會升高。在資源有限的移動設備上,大量的使用枚舉無疑是致命的。

  1. 尋找替代方案

    • 使用常量替換枚舉

      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 類型的參數。此時如果不看方法體,調用者根本不知道該傳什么值。

  2. 接下來就要使用注解來解決這個問題了。

    • 引入注解庫
    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);//這里會顯示紅色錯誤
        }
    }
    

    雖然顯示紅色錯誤,但仍可以執行,不過這樣已經起到警告的作用了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 傳送門 解讀阿里Java開發手冊(v1.1.1) - 異常日志 前言 阿里Java開發手冊談不上圣經,但確實是大量...
    kelgon閱讀 4,385評論 4 50
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,865評論 0 6
  • 小丸子長得算標志,平時穿著打扮也有自己的風格。 除了自拍,她很少讓別人給她拍照,她總有一系列的顧慮,擔心自己會翻白...
    鴨梨神娃閱讀 1,219評論 7 18