美文网首页Android
枚举根据状态获取不同属性及在Android开发中优先使用注解替代

枚举根据状态获取不同属性及在Android开发中优先使用注解替代

作者: Swart | 来源:发表于2017-11-19 16:28 被阅读0次

    这篇文章忘记是在哪里看的了,所以没有写上出处

    枚举根据状态获取不同属性及在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;
                }
            }
        

      ​ 上述代码达到了和枚举一样的效果,完全可以不使用枚举。可是,让我再回到使用枚举的好处:

      • 保证了类型安全:调用者无法随意传一个 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);//这里会显示红色错误
          }
      }
      

      虽然显示红色错误,但仍可以执行,不过这样已经起到警告的作用了。

    相关文章

      网友评论

        本文标题:枚举根据状态获取不同属性及在Android开发中优先使用注解替代

        本文链接:https://www.haomeiwen.com/subject/phcpvxtx.html