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.0’ }

然后再使用,代码如下:

public class MainActivity extends Activity {

public static final int MALE = 0;

public static final int FEMALE = 1;

@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会直接报错:

d6b96afea28e428b41da857210aa5af0.png

0b1331709591d260c1c78e86d0c51c18.png

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐