在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.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 *。
有木有?
微信关注我们,可以获取更多
在Android中使用枚举注解而不是枚举的更多相关文章
- 在ASP.Net Core 中使用枚举类而不是枚举
前言:我相信大家在编写代码时经常会遇到各种状态值,而且为了避免硬编码和代码中出现魔法数,通常我们都会定义一个枚举,来表示各种状态值,直到我看到Java中这样使用枚举,我再想C# 中可不可以这样写,今天 ...
- Android中的自定义注解(反射实现-运行时注解)
预备知识: Java注解基础 Java反射原理 Java动态代理 一.布局文件的注解 我们在Android开发的时候,总是会写到setContentView方法,为了避免每次都写重复的代码,我们需要使 ...
- android中常用的注解说明
1.@Nullable 作用于函数参数或者返回值,标记参数或者返回值可以为空. 2,@NonMull 作用于函数参数或者返回值,标记参数或者返回值不可以为空. 3.@LayoutRes 标记整数值a ...
- android中文件操作的四种枚举
1.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用自身访问,在该模式下,写入的的内容会覆盖原文件中的内容. 2.MODE_APPEND:该模式会检查文件是否存在,存在就往文件 ...
- 【转】Android中的内存管理--不错不错,避免使用枚举类型
原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...
- Android中通过注解代替findViewById方法
转自:http://www.2cto.com/kf/201405/302998.html 这篇文章主要讲解注解实现findViewById的功能,首先我们来熟悉一下在java中怎么定义一个注解和解析一 ...
- Android中是否推荐使用枚举Enum
一.Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等.其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟 ...
- 理解Android中的注解与反射
反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法:对于任何一个对象,都能够调用它的任何一个方法和属性: 这样动态获取新的 ...
- Android中的IOC框架,完全注解方式就可以进行UI绑定和事件绑定
转载请注明出处:http://blog.csdn.net/blog_wang/article/details/38468547 相信很多使用过Afinal和Xutils的朋友会发现框架中自带View控 ...
随机推荐
- IIS 部署WCF服务注意事项
IIS部署WCF服务的时候经常会出现如下错误: System.ServiceModel.EndpointNotFoundException”类型的未经处理的异常在 WinformWcfHost.exe ...
- Jenkins设置Master/Slave
说明:通过master/slave模式,可以在master节点上统一管理其他slave节点. 下面说明一步步实现master/slave模式. 第一步:以管理员登录jenkins.点击"系统 ...
- html之结构化标记
1.什么是结构化标记 对布局使用的div 进行升级 , 根据页面的不同区域而提供的不同标签.作用与div几乎一致 专门用于搭建网站结构而用 2.结构标记详解 1.<header>元素 作用 ...
- JavaService实现Windows服务
下载JavaService.exe文件 下载地址:http://pan.baidu.com/s/1boWk1uJ(支持Windows 7 64位) 创建server文件目录 在D盘新建一个文件夹如:D ...
- JS - JSON.stringify
- Reverse Integer - 反转一个int,溢出时返回0
Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, retur ...
- 【NOI模拟】谈笑风生(主席树)
题目描述 设 T 为一棵有根树,我们做如下的定义: 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称 “ a 比 b 不知道高明到哪里去了 ” . 设 a 和 b 为 T 中 ...
- 【SpringMVC】【EasyUI】关于使用EasyUIForm上传文件,返回JsonIE提示下载文件的解决办法!
先说一下环境 EasyUI+SpringMVC+MyBatis 因为按正常手段,无法使用Ajax来提交一个包含文件的表单,故想到利用EasyUI的Form来提交,EasyUI的form封装了一套伪Aj ...
- Ionic 安装创建项目
在安装了node+Cordova的情况下(过程参考我之前的文章Phonegap环境配置),安装ionic: 安装ionic npm install -g ionic Android创建安装: npm ...
- Spring阅读方法
转自:http://www.cnblogs.com/xing901022/p/4178963.html 最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验, ...