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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,302评论 19 139
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 9,851评论 4 50
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,815评论 18 399
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 9,416评论 0 6
  • 小丸子长得算标志,平时穿着打扮也有自己的风格。 除了自拍,她很少让别人给她拍照,她总有一系列的顾虑,担心自己会翻白...
    鸭梨神娃阅读 4,987评论 7 18

友情链接更多精彩内容