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.RUNTIME
, RetentionPolicy.CLASS
分别表示这个注解保留到运行时,和字节码阶段。
我们这里使用 RetentionPolicy.SOURCE
的用意就是在编码时能够识别出错误的 FileType
,至于 RUNTIME
和 CLASS
阶段的状态,我们是不关心的。
@IntDef
是 android.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 *。
有木有?
微信关注我们,可以获取更多