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. VB6之WebBrowser控件

    UI短手或者GDI+用烦的童鞋可以借用WebBrowser打造漂亮的程序界面,只需要下载一个好看点的html代码就够了. 引用: Microsoft Html Object Library 部件: M ...

  2. JS将文件以form表单一样提交到后台

    这是很简单.. HTML <div> <input type="file" id="myfile"> <input type=&q ...

  3. Chrome浏览器扩展开发系列之八:Chrome扩展的数据存储

    Google Chrome浏览器扩展可以使用如下任何一种存储机制: HTML5的localStorage API实现的本地存储(此处略) Google的chrome.storage.* API实现的浏 ...

  4. CSS 选择器优先级问题

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  5. CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)

    CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划) Description 字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因 ...

  6. hibernate的对象状态分析

    开发框架 springMVC hibernate5.0.1 hibernate三种状态 Hibernate定义并支持下列对象状态(state): 临时状态(Transient) 当new一个实体对象后 ...

  7. redhat系列linux系统 修改主机名的正确方法

    ##注:无特别说明,以下称呼的linux系统统一视为redhat系linux redhat系列linux系统 如果想修改主机名 很多人可能都会以为是: $hostname NEW-NAME 或者在 / ...

  8. Xamarin Android绑定微信SDK

    现在几乎所有的APP都集成了向微博,微信等社交平台分享的功能.这些社交平台官方也提供了SDK让开发者使用,对于Android和IOS平台而言,只需要下载官方的SDK,按照官方说明文档进行集成就可以轻松 ...

  9. input复选框操作的部分高频率使用代码

    1. 获取单个checkbox选中项(三种写法): $("input:checkbox:checked").val() 或者 $("input:[type='checkb ...

  10. DirectX 11---从空间变换来看3D场景如何转化到2D屏幕

    DirectX 11---从空间变换来看3D场景如何转化到2D屏幕 在看<Introduction to 3D Game Programming with DirectX 11>的时候,发 ...