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中使用枚举注解而不是枚举的更多相关文章

  1. 在ASP.Net Core 中使用枚举类而不是枚举

    前言:我相信大家在编写代码时经常会遇到各种状态值,而且为了避免硬编码和代码中出现魔法数,通常我们都会定义一个枚举,来表示各种状态值,直到我看到Java中这样使用枚举,我再想C# 中可不可以这样写,今天 ...

  2. Android中的自定义注解(反射实现-运行时注解)

    预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...

  3. android中常用的注解说明

    1.@Nullable  作用于函数参数或者返回值,标记参数或者返回值可以为空. 2,@NonMull 作用于函数参数或者返回值,标记参数或者返回值不可以为空. 3.@LayoutRes 标记整数值a ...

  4. android中文件操作的四种枚举

    1.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用自身访问,在该模式下,写入的的内容会覆盖原文件中的内容. 2.MODE_APPEND:该模式会检查文件是否存在,存在就往文件 ...

  5. 【转】Android中的内存管理--不错不错,避免使用枚举类型

    原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...

  6. Android中通过注解代替findViewById方法

    转自:http://www.2cto.com/kf/201405/302998.html 这篇文章主要讲解注解实现findViewById的功能,首先我们来熟悉一下在java中怎么定义一个注解和解析一 ...

  7. Android中是否推荐使用枚举Enum

    一.Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等.其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟 ...

  8. 理解Android中的注解与反射

    反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任何一个方法和属性: 这样动态获取新的 ...

  9. Android中的IOC框架,完全注解方式就可以进行UI绑定和事件绑定

    转载请注明出处:http://blog.csdn.net/blog_wang/article/details/38468547 相信很多使用过Afinal和Xutils的朋友会发现框架中自带View控 ...

随机推荐

  1. Java Web - HTML 常用标签和符号

    1.Html 注释,pre,&lt,&gt,&nbsp,超级链接,marquee,img标签 <html> <head> <title>常用 ...

  2. App的前后台数据同步

    前言 在开发一个点餐软件时,app的订单数据是使用本地Sqlite数据库,在提交订单数据后,当订单数据在后台(Mysql数据库)发生变化时(如:已买单),本地数据如何改变呢? 思路 前台在查询时,将后 ...

  3. Java虚拟机:如何判定哪些对象可回收?

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在堆内存中存放着Java程序中几乎所有的对象实例,堆内存的容量是有限的,Java虚拟机会对堆内存进行管理,回收已经"死去&quo ...

  4. Java基础语法<十二> 泛型程序设计

    1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...

  5. Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动

    Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动 >>>>>>>>>>>>>> ...

  6. Xcode导出App一般问题及其解决方法(开发者协议变更及Bundle Id过期问题)

    Xcode导出App一般问题及其解决方法 问题一:开发者协议变更问题. 变更后打包会出现如下图A警告,此时点击 "visit developer website"进入Apple开发 ...

  7. Android - AIDL 使用

    AIDL(Android Interface Definition Language) 程序员可以利用AIDL自定义编程接口,在客户端和服务端之间实现进程间通信(IPC).在Android平台上,一个 ...

  8. 【转载】DHCP流程

    来源: http://network.51cto.com/art/201406/441752.htm DHCP是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动 ...

  9. linux用户及权限管理

    [文件管理.管道.用户及组管理.用户及权限管理]\用户及组管理 用户与组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  10. Mybaits简诉

    先组织一下语言!Mybatis是一个框架,一个数据持久化的框架,作用就是SQL语句的映射!减少了JDBC繁琐的数据操作与类型转换!简而言之,就是方便.轻巧!什么是持久化,持久,恩,JDBC就是一个数据 ...