Android使用枚举正确姿态

那实际开发中肯定是要用Java枚举的,那有没有什么解决办法了。答案肯定是有的,只是换成另外一种方式

/**
* Android枚举
*/
public class TestEnum {
  /**
   * @Retention(RetentionPolicy.SOURCE) 注解可以告知编译器不将枚举的注解数据存储在 .class 文件中
   *
   */
  /**
   * @StringDef创建整型和字符串集的枚举注解来验证其他类型的代码引用
   * 具体详细看官网{@link https://developer.android.com/studio/write/annotations.html?hl=zh-cn#adding-annotations}
   */
  @Retention(RetentionPolicy.SOURCE)
  @StringDef({
          POWER_SERVICE,
          WINDOW_SERVICE,
          LAYOUT_INFLATER_SERVICE
  })
  //@interface这是Java用来定义一个注解类。
  public @interface ServiceName {}
  public static final String POWER_SERVICE = "power";
  public static final String WINDOW_SERVICE = "window";
  public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
  public static String getSystemService(@ServiceName String name) {
      if (POWER_SERVICE.equals(name)) {
          return POWER_SERVICE;
      } else if (WINDOW_SERVICE.equals(name)) {
          return WINDOW_SERVICE;
      } else if (LAYOUT_INFLATER_SERVICE.equals(name)) {
          return LAYOUT_INFLATER_SERVICE;
      }
      return null;
  }
  public static void main(String[] args) {
      //使用
System.out.println(TestEnum.getSystemService(TestEnum.LAYOUT_INFLATER_SERVICE));
  }
}

这就是官网的写法了。可是发现每次传参数是

TestEnum.LAYOUT_INFLATER_SERVICE
或者
TestEnum.POWER_SERVICE

而不是像我们Java枚举的传参方式

ServiceName.LAYOUT_INFLATER_SERVICE

那是不是需要改造下。查看资料可以这样写

/**
 * Android枚举
 */
public class TestEnum {
    /**
     * @Retention(RetentionPolicy.SOURCE) 注解可以告知编译器不将枚举的注解数据存储在 .class 文件中
     *
     */
    /**
     * @StringDef创建整型和字符串集的枚举注解来验证其他类型的代码引用 具体详细看官网{@link https://developer.android.com/studio/write/annotations.html?hl=zh-cn#adding-annotations}
     */
    @Retention(RetentionPolicy.SOURCE)
    @StringDef({
            ServiceName.POWER_SERVICE,
            ServiceName.WINDOW_SERVICE,
            ServiceName.LAYOUT_INFLATER_SERVICE
    })
    //@interface这是Java用来定义一个注解类。
    public @interface ServiceName {
        String POWER_SERVICE = "power";
        String WINDOW_SERVICE = "window";
        String LAYOUT_INFLATER_SERVICE = "layout_inflater";
    }

    public static String getSystemService(@ServiceName String name) {
        if (ServiceName.POWER_SERVICE.equals(name)) {
            return ServiceName.POWER_SERVICE;
        } else if (ServiceName.WINDOW_SERVICE.equals(name)) {
            return ServiceName.WINDOW_SERVICE;
        } else if (ServiceName.LAYOUT_INFLATER_SERVICE.equals(name)) {
            return ServiceName.LAYOUT_INFLATER_SERVICE;
        }
        return null;
    }

    public static void main(String[] args) {
        //使用
        System.out.println(TestEnum.getSystemService(ServiceName.LAYOUT_INFLATER_SERVICE));
    }
}

不错,就是把常量放到里面去了。这个时候差不多好了,不过怎么看

public static String getSystemService(@ServiceName String name) {
        if (ServiceName.POWER_SERVICE.equals(name)) {
            return ServiceName.POWER_SERVICE;
        } else if (ServiceName.WINDOW_SERVICE.equals(name)) {
            return ServiceName.WINDOW_SERVICE;
        } else if (ServiceName.LAYOUT_INFLATER_SERVICE.equals(name)) {
            return ServiceName.LAYOUT_INFLATER_SERVICE;
        }
        return null;
    }

这个代码还是有点怪怪的,每次添加一个值都需要加一个else if太麻烦了。在Java中可以通过enum.values()获取所有enum的值那是不是有类似的方法,找了资料好像没有发现,那只能通过反射获取所有的public的参数和参数值了

public static String getSystemService(@ServiceName String name) {
        Field[] fields = ServiceName.class.getDeclaredFields();
        for (Field field : fields) {
            //在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象
            field.setAccessible(true);
            String value = null;
            try {
                value = String.valueOf(field.get(field.getName()));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            if (value != null && value.equals(name)) {
                return value;
            }
        }
        return null;
    }

ok完成,代码地址

这里有几个知识点参考资料链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,495评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 3,828评论 2 8
  • vim模式介绍 几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数的编辑器使用了与Vim截然不同的方式:命令...
    EldonZhao阅读 537评论 0 3
  • 01 我是一个孤独症患者,有人说,越是向往明天的人,越是孤独。 骑着单车,顶着四十度的高温,在这座寂静的城市里疯狂...
    昨日的酒阅读 394评论 7 9