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

简介: Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android. 很多开发规范都是不建议在Android中使用枚举的,在Android系统中使用枚举的开销是使用常量的2倍。

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(@FileTypeDef int fileType) 表示 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 *。

有木有?

 

微信关注我们,可以获取更多

目录
相关文章
|
Android开发
【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
581 0
【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
|
存储 Java Android开发
Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如此清晰和简单)
Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如此清晰和简单)
|
安全 编译器 Android开发
Android基础--kotlin(十)Kotlin 枚举类
Android基础--kotlin(十)Kotlin 枚举类
|
Java 编译器 开发工具
Android高阶用法:注解处理器APT用法详解
注解在我们`android`开发和`java`开发中有很多作用,今天我们就来介绍下他的一种高级用法:**注解处理器**
|
ARouter Java Android开发
Android 组件化(二)注解与注解处理器、组件通讯
在上一篇文章中,我们完成了组件的创建、gradle统一管理、组件模式管理和切换,那么这一篇文章,我们需要做的就是组件之间的通讯了。
250 0
Android 组件化(二)注解与注解处理器、组件通讯
|
Java Android开发
Android中 @CallSuper注解
Android中 @CallSuper注解
|
监控 Android开发
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )(二)
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )(二)
165 0
【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )(二)
|
Android开发
【Android 组件化】路由组件 ( 注解处理器调试 )(二)
【Android 组件化】路由组件 ( 注解处理器调试 )(二)
63 0
【Android 组件化】路由组件 ( 注解处理器调试 )(二)
|
Java Android开发
【Android 组件化】路由组件 ( 注解处理器调试 )(一)
【Android 组件化】路由组件 ( 注解处理器调试 )(一)
234 0
【Android 组件化】路由组件 ( 注解处理器调试 )(一)
|
Java Android开发
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
202 0
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )