android 枚举类型 替换之道

本文探讨了在Android开发中使用枚举类型可能导致的性能问题,并介绍了如何利用IntDef注解来提高代码的安全性和可读性,同时避免内存消耗过大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK 1.5版本开始支持枚举类型,枚举类型使用关键字enum定义。

如果我们使用枚举类型来定义常量,会使代码更加易读并且安全,但性能上会差很多。枚举类型比普通常量类型的dex size 大 12倍以上(dex code 变大),运行时内存分配,一个enum值的声明会消耗20bytes以上,还不包括对象数组保持对enum值的引用。项目中大量使用enum,对内存影响不可忽视。

安卓官方文档已经提醒开发者尽量避免使用枚举类型,同时提供注解的方式检查类型安全,目前提供了int型和string型两种注解:IntDef和StringDef,用来提供编译期的类型检查。


http://developer.android.com/intl/zh-cn/training/articles/memory.html


public class Cat {
    public static final int MALE = 0;
    public static final int FEMALE = 1;
    private int sex;
    public void setSex(int sex) { this.sex = sex; }
    public String getSexDes() {
        if(sex == 0) {
            return "公";
        }else if(sex == 1){
            return "母";
        }else {
            throw new IllegalArgumentException("Unkonw");
        }
    }
}


引入依赖包
compile 'com.android.support:support-annotations:22.0.0'

public class Cat {
    public static final int MALE = 0;
    public static final int FEMALE = 1;
    @IntDef({MALE, FEMALE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SEX {
    }
    private int sex;
    public void setSex(@SEX int sex) {
        this.sex = sex;
    }
    public String getSexDes() {
        if(sex == 0) {
            return "公";
        }else if(sex == 1){
            return "母";
        }else {
            throw new IllegalArgumentException("Unkonw");
        }
    }
}

@SEX注解可以放到属性定义,参数,返回值等地方对数据类型进行限制。如果随便赋值一个其他Int参数给setSex(),IDE会直接报错





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值