Android之使用枚举利弊及替代方案
Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代
使用 Enum 的缺点
每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存。
较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的开销,使我们的应用需要更多的空间。
如果你的应用使用很多的 Enum ,最好使用Integer 或 String 替代他们,但是这样还会有问题。
既然都说到这个份上了,那么有什么比较好的解决方法呢?
public class SexTest{
public static enum Sex {
MAN, WOMEN
}
private Sex sex;
//设置性别
public void setSex(Sex sex){
this.sex = sex;
}
//获取性别
public String getSex(){
if(Sex.MAN == sex) return "男";
if(Sex.WOMEN == sex) return "女";
return "未知";
}
public static void main(String[] args){
//这里的入参必须为Sex枚举类中的其中一个枚举常量
//绝对不允许输入没有再Sex枚举里面定义的常量
setSex(Sex.MAN);
String resultSex = getSex();
System.out.println("resultSex: " + resultSex);
//输出:resultSex: 男
}
}
解决方案
既然是因为参数的类型太泛了造成的类型不安全,那么我只要将参数限定在某一个类型集合里面,不就大功告成了?!
是滴,一下就是要将的@IntDef/@StringDef + @interface来进行限定参数。
首先你要在build.gradle文件中添加依赖
dependencies { compile ‘com.android.support:support-annotations:24.2.’ }
然后再使用,代码如下:
public class MainActivity extends Activity {
public static final int MALE = ;
public static final int FEMALE = ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Person person = new Person();
person.setSex(MALE);
((Button) findViewById(R.id.test)).setText(person.getSexDes());
}
class Person {
@SEX
private int sex;
public void setSex(@SEX int sex) {
this.sex = sex;
}
@SEX
public int getSex() {
return sex;
}
public String getSexDes() {
if (sex == MALE) {
return "男";
} else {
return "女";
}
}
}
@IntDef({MALE, FEMALE})
@Retention(RetentionPolicy.SOURCE)
public @interface SEX {
}
}
如果我们尝试在调用setSex()方法的时候,传入不在限定之内的值,那么编译就不会通过,有错误提示。同理,我们也可以使用@StringDef。
这里我们可以看到,@SEX注解可以放到属性定义,参数,返回值等地方对数据类型进行限制。如果我们直接赋值一个Int参数给setSex(),IDE会直接报错:

Android之使用枚举利弊及替代方案的更多相关文章
- 在Android中使用枚举注解而不是枚举
Enums often require more than twice as much memory as static constants. You should strictly avoid us ...
- [Android学习笔记]枚举与int的转换
package com.example.enumdemo; import android.app.Activity; import android.os.Bundle; import android. ...
- android开发学习 ------- 枚举类型在Android中的用法
一般上为了简化代码,重用代码,设置标志位来表示不同的流程,这个标志位可以使用枚举类型来表示: 1:定义 public FbManner fbManer = FbManner.EMAIL; //给一个默 ...
- Android 中如何使用 enum / 枚举
如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...
- Android性能优化-内存优化
原文链接 Manage Your App’s Memory 前言 在任何软件开发环境中,RAM都是比较珍贵的资源.在移动操作系统上更是这样,因为它们的物理内存通常受限.尽管在ART和Dalvik虚拟机 ...
- Android开发网上的一些重要知识点[经验分享]
1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是s ...
- 窥探Swift之别样的枚举类型
想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...
- 关于Java中枚举Enum的深入剖析
在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定.Java也不例外.Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析. 什么是Enum Enum是自Java ...
- Java内部类,枚举
模式: 模板模式: 简单工厂模式: 适配器模式: interface ICellPhone { void sendMsg(); } class Android implements ICel ...
随机推荐
- PHP:判断客户端是否使用代理服务器及其匿名级别
要判断客户端是否使用代理服务器,可以从客户端所发送的环境变量信息来判断. 具体来说,就是看HTTP_VIA字段,如果这个字段设置了,说明客户端使用了代理服务器. 匿名级别可以参考下表来判断. 给出一个 ...
- Dynamo(Amazon分布式存储引擎)
参考资料: http://blog.csdn.net/zgl_dm/article/details/6291984 http://blog.csdn.net/cywosp/article/detail ...
- 一学期积累下来的SQL语句写法的学习
整合了一下上学期学习的积累,希望可以帮到初学者! 可能以后会有用吧! A 基本语句的运用 操作基于emp表1.按工资从高到低排列SQL> select rownum as 次序,ename,sa ...
- CentOS 6.5 网络服务器功能的实现①:运用bind搭建基本的DNS服务器
何谓DNS服务?简而言之,DNS服务在互联网中可以实现域名解析(把域名转换成网络可以识别的IP地址). 名词解释①:正向解析:域名解析IP地址:反向解析:IP地址解析域名. DNS服务的正/反向区域解 ...
- 单线程实现同时监听多个端口(windows平台c++代码)
前言 多年前开发了一套网络库,底层实现采用IOCP(完成端口).该库已在公司多个程序中应用:经过多次修改,长时间检验,已经非常稳定高效. 最近把以前的代码梳理了一下,又加进了一些新的思路.代码结构更加 ...
- 详解C#特性和反射(三)
类型信息(Type Information)用来表示类型声明的信息,通过抽象基类System.Type的实例存储这些信息,当使用反射时,CLR获取指定类型的Type对象,通过这个对象即可访问该类型的任 ...
- async/await 与 generator、co 的对比
之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...
- Spring中使用变量${}的方式进行参数配置
在使用Spring时,有些情况下,在配置文件中,需要使用变量的方式来配置bean相关属性信息,比如下面的数据库的连接使用了${}的方式进行配置,如下所示: <bean id="data ...
- Redis列表操作
列表类似于双向链表结构,可从序列两端推入或者弹出元素. (列表常用命令) RPUSH : RPUSH key-name value [value1 value2,...] ------------将 ...
- C#多线程和线程池[转]
1.概念 1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,C ...