专栏首页终身开发者在Android中使用枚举注解而不是枚举

在Android中使用枚举注解而不是枚举

Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.

很多开发规范都是不建议在Android中使用枚举的,在Android系统中使用枚举的开销是使用常量的2倍。一般地,在一个文件中定义常量

public class FileType {
  public static final int TYPE_MUSIC = 0;
  public static final int TYPE_PHOTO = 1;
  public static final int TYPE_TEXT = 2;

  public final int fileType;

  public FileType(int fileType) {
    this.fileType = fileType;
  }
}

但这样的定义会有一定有小问题。就是这个类在给他人使用时,构造函数由于参数是 int 类型。所以他可以传递我们定义好的3种类型中的其它任意 int 数值,这就有可能会产生某种错误。我们希望 当用户输入了我们定义之外的数值,编辑器可以给我们提示。下面我们就看看 android.support.annotation 包中提供的注解帮我们解决这个问题。

@IntDef

我们先看用法,使用上面的例子

public class FileType {
  public static final int TYPE_MUSIC = 0;
  public static final int TYPE_PHOTO = 1;
  public static final int TYPE_TEXT = 2;

  public final int fileType;
  //Retention 是元注解,简单地讲就是系统提供的,用于定义注解的“注解”
  @Retention(RetentionPolicy.SOURCE)
  //这里指定int的取值只能是以下范围
  @IntDef({TYPE_MUSIC, TYPE_PHOTO, TYPE_TEXT})
  @interface FileTypeDef {
  }
  public FileType(@FileTypeDef int fileType) {
    this.fileType = fileType;
  }
}

@Retention 是元注解,简单地讲就是系统提供的,用于定义注解的“注解”。使用这个标识了注解的生命周期,这里指定值为 RetentionPolicy.SOURCE 说明这个注解保留在源码阶段。还有 RetentionPolicy.RUNTIMERetentionPolicy.CLASS 分别表示这个注解保留到运行时,和字节码阶段。

我们这里使用 RetentionPolicy.SOURCE 的用意就是在编码时能够识别出错误的 FileType,至于 RUNTIMECLASS 阶段的状态,我们是不关心的。

@IntDefandroid.support.annotation 包定义的注解,使用它来规范我们的 fileType 变量的取值范围。例如在构造函数中使用 FileType(@FileTypeDefintfileType) 表示 fileType 的取值只能是 TYPE_MUSIC,TYPE_PHOTO,TYPE_TEXT

如果在传参时没有按照指定的值那么编辑器就会发出警告,这样就可以在编码的时候进行提示。

@StringDef

同样地,还可以对字符串常量定义注解。例如对于以下文件

public class FileType {
  public static final String TYPE_MUSIC = "mp3";
  public static final String TYPE_PHOTO = "png";
  public static final String TYPE_TEXT = "txt";

  public final String fileType;

  public FileType(String fileType) {
    this.fileType = fileType;
  }
}

使用 @StringDef 注解

public class FileType {
  //...类型定义
  public final String fileType;

  //Retention 是元注解,简单地讲就是系统提供的,用于定义注解的“注解”
  @Retention(RetentionPolicy.SOURCE)
  //这里指定int的取值只能是以下范围
  @StringDef({TYPE_MUSIC, TYPE_PHOTO, TYPE_TEXT})
  @interface FileTypeDef {
  }
  public FileType(@FileTypeDef int fileType) {
    this.fileType = fileType;
  }
}

使用注解除了可以避免不必要错误外,还能瞬间提升自己写代码的 Level

有木有?

鼓励我

本文分享自微信公众号 - 终身开发者(AngryCode),作者:wecodexyz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android实现长图截取、拼接和添加水印

    本文的讨论是基于手机在没有root情形。 早期版本的Android是没有提供截屏功能的,到4.0时代后才自带了音量Down+电源键截屏的功能。在开发过程中还可以...

    阳仔
  • App 组件化/模块化之路——使用SDK的思路进行模块化设计接口

    在不久之前分享一篇《App 组件化/模块化之路——如何封装网络请求框架》文章介绍了我在项目中封装网络请求框架的思路。开发一个 App 会涉及到很多网络请求 AP...

    阳仔
  • Android WebView 安全问题汇总

    在使用WebView开发时注入JS对象,当App具有读写SDCARD权限,那么注入的JS对象就可以通过反射机制获取到Java对象Runtime,并调用静态方法来...

    阳仔
  • Linux 内核0.11 系统调用详解(下)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • C# Lambda表达式详解,及Lambda表达式树的创建

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的...

    zls365
  • 【面试高频系列】Top K 问题的多种解法:冒泡排序 & 快速排序 & 优先队列 ...

    这是 LeetCode 上的「703. 数据流中的第 K 大元素」,难度为 「Easy」。

    宫水三叶的刷题日记
  • Segment Routing 在大规模数据中的应用(上)

    在写《BGP在大规模数据中心中的应用》里当时就有了讨论Segment Routing(SR)的想法,因为当时我还在参与MPLS+SR的白皮书测试,得到了不少真实...

    SDNLAB
  • LeetCode113|两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    码农王同学
  • Java生成随机姓名、性别和年龄

    崔笑颜
  • [javaSE] 数据结构(队列)

    陶士涵

扫码关注云+社区

领取腾讯云代金券