Android使用注解代替枚举节省系统内存开销的方法
Java5以后开始支持枚举类型,枚举类型使用起来非常方便,其重要的作用是作为类型安全使用的。如果在不考虑系统内存开销的情况下大量的使用枚举也不会有什么问题。但是移动端还是需要注意的。
android系统在应用启动后会给应用单独分配一块内存。应用的dexcode、heap以及运行时的内存分配都会在这块内存中。而使用枚举类型的dexsize是普通常亮的13倍以上。在运行时的内存分配,一个enum的声明至少要消耗掉20个bytes。从这两点就可以说明,在app中大量使用枚举的内存开销是非常大的。
枚举最大的优势是类型安全。那么是不是又办法在不使用枚举的情况下做到类型安全呢?答案是肯定的,下面看看怎么干。
goodle官方很早就发现了枚举对android系统带来的性能开销,所以在其官网上就已经提醒了开发者尽量少的使用枚举,而且还提供了注解的方式来检查类型安全。目前其提供了int和string两种注解方式。分别是:IntDef和StringDef。
话不多说,直接上例子。ps:demo里面有详细的注释。
一、Int类型注解检查类型安全
packagecom.yw.enumproxylib; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importandroidx.annotation.IntDef; /** *定义一个int类型的注解 *用注解代替枚举,做到类型安全 *createbyyangwei *on2020-01-3021:34 */ publicclassEnumProxy{ publicstaticfinalintREAD_CAR=0;//红色的汽车 publicstaticfinalintGREEN_CAR=1;//绿色的汽车 publicstaticfinalintYELLOW_CAR=2;//黄色的汽车 @IntDef({READ_CAR,GREEN_CAR,YELLOW_CAR}) @Retention(RetentionPolicy.SOURCE)//源码级别 public@interfaceCAR_Enum{ } /** *获取汽车类型 * *@paramcar *@return */ publicstaticintgetCar(@CAR_Enumintcar){ switch(car){ caseREAD_CAR: return0; caseGREEN_CAR: return1; caseYELLOW_CAR: return2; } return-1; } }
二、String类型注解检查类型安全
packagecom.yw.enumproxylib; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importandroidx.annotation.StringDef; /** *定义一个string类型的注解,用于检查星期的类型安全。 *createbyyangwei *on2020-01-3022:04week */ publicclassStringEnum{ publicstaticfinalStringMONDAY="monday"; publicstaticfinalStringTUESDAY="tuesday"; publicstaticfinalStringWENDESDAY="wendesday"; publicstaticfinalStringTHURSDAY="thursday"; publicstaticfinalStringFRIDAY="friday"; publicstaticfinalStringSATURDAY="saturday"; publicstaticfinalStringWEEKDAY="weekday"; @StringDef({MONDAY,TUESDAY,WENDESDAY,THURSDAY,FRIDAY,SATURDAY,WEEKDAY})//此处定义注解的值只能是这几个 @Retention(RetentionPolicy.SOURCE)//编译时注解,源码级检查 public@interfaceWeek{ } /** *获取日期 * *@paramweek *@return */ publicstaticStringgetWeek(@WeekStringweek){ switch(week){ caseMONDAY: return"星期一"; caseTUESDAY: return"星期二"; caseWENDESDAY: return"星期三"; caseTHURSDAY: return"星期四"; caseFRIDAY: return"星期五"; caseSATURDAY: return"星期六"; caseWEEKDAY: return"星期日"; } returnnull; } }
三、用来检查类型安全的MainActivity,从下面可以看到,当使用EnumProxy.getCar输入参数的时候,如果直接输入一个整数则编译不通过。当输入我们定义的EnumProxy.GREEN_CAR编译才通过。
同理StringEnum也能检查类型安全。
packagecom.yw.enumproxy; importandroidx.appcompat.app.AppCompatActivity; importandroid.os.Bundle; importcom.yw.enumproxylib.EnumProxy; importcom.yw.enumproxylib.StringEnum; /** *测试例子 */ publicclassMainActivityextendsAppCompatActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intcar_black=10; intbk=EnumProxy.getCar(car_black);//此处类型检查不通过 intck=EnumProxy.getCar(EnumProxy.GREEN_CAR);//类型检查通过 Stringstr="friday"; Stringweek1=StringEnum.getWeek(str);//直接赋值String时类型检查不通过 Stringweek2=StringEnum.getWeek(StringEnum.FRIDAY);//赋值定义好的值时类型检查通过 } }
以上知识点如果大家在学习的时候有任何疑问可以联系毛票票小编补充分享。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。