Android使用注解代替枚举节省系统内存开销的方法
时间:2022-07-27
本文章向大家介绍Android使用注解代替枚举节省系统内存开销的方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Java5以后开始支持枚举类型,枚举类型使用起来非常方便,其重要的作用是作为类型安全使用的。如果在不考虑系统内存开销的情况下大量的使用枚举也不会有什么问题。但是移动端还是需要注意的。
android系统在应用启动后会给应用单独分配一块内存。应用的dex code、heap以及运行时的内存分配都会在这块内存中。而使用枚举类型的dex size是普通常亮的13倍以上。在运行时的内存分配,一个enum的声明至少要消耗掉20个bytes。从这两点就可以说明,在app中大量使用枚举的内存开销是非常大的。
枚举最大的优势是类型安全。那么是不是又办法在不使用枚举的情况下做到类型安全呢?答案是肯定的,下面看看怎么干。
goodle官方很早就发现了枚举对android系统带来的性能开销,所以在其官网上就已经提醒了开发者尽量少的使用枚举,而且还提供了注解的方式来检查类型安全。目前其提供了int和string两种注解方式。分别是:IntDef和StringDef。
话不多说,直接上例子。ps:demo里面有详细的注释。
一、Int类型注解检查类型安全
package com.yw.enumproxylib;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import androidx.annotation.IntDef;
/**
* 定义一个int类型的注解
* 用注解代替枚举,做到类型安全
* create by yangwei
* on 2020-01-30 21:34
*/
public class EnumProxy {
public static final int READ_CAR = 0;//红色的汽车
public static final int GREEN_CAR = 1;//绿色的汽车
public static final int YELLOW_CAR = 2;//黄色的汽车
@IntDef({READ_CAR, GREEN_CAR, YELLOW_CAR})
@Retention(RetentionPolicy.SOURCE)//源码级别
public @interface CAR_Enum {
}
/**
* 获取汽车类型
*
* @param car
* @return
*/
public static int getCar(@CAR_Enum int car) {
switch (car) {
case READ_CAR:
return 0;
case GREEN_CAR:
return 1;
case YELLOW_CAR:
return 2;
}
return -1;
}
}
二、String类型注解检查类型安全
package com.yw.enumproxylib;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import androidx.annotation.StringDef;
/**
* 定义一个string类型的注解,用于检查星期的类型安全。
* create by yangwei
* on 2020-01-30 22:04 week
*/
public class StringEnum {
public static final String MONDAY = "monday";
public static final String TUESDAY = "tuesday";
public static final String WENDESDAY = "wendesday";
public static final String THURSDAY = "thursday";
public static final String FRIDAY = "friday";
public static final String SATURDAY = "saturday";
public static final String WEEKDAY = "weekday";
@StringDef({MONDAY, TUESDAY, WENDESDAY, THURSDAY, FRIDAY, SATURDAY, WEEKDAY})//此处定义注解的值只能是这几个
@Retention(RetentionPolicy.SOURCE)//编译时注解,源码级检查
public @interface Week {
}
/**
* 获取日期
*
* @param week
* @return
*/
public static String getWeek(@Week String week) {
switch (week) {
case MONDAY:
return "星期一";
case TUESDAY:
return "星期二";
case WENDESDAY:
return "星期三";
case THURSDAY:
return "星期四";
case FRIDAY:
return "星期五";
case SATURDAY:
return "星期六";
case WEEKDAY:
return "星期日";
}
return null;
}
}
三、用来检查类型安全的MainActivity,从下面可以看到,当使用EnumProxy.getCar输入参数的时候,如果直接输入一个整数则编译不通过。当输入我们定义的EnumProxy.GREEN_CAR编译才通过。
同理StringEnum也能检查类型安全。
package com.yw.enumproxy;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.yw.enumproxylib.EnumProxy;
import com.yw.enumproxylib.StringEnum;
/**
* 测试例子
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int car_black = 10;
int bk = EnumProxy.getCar(car_black);//此处类型检查不通过
int ck = EnumProxy.getCar(EnumProxy.GREEN_CAR);//类型检查通过
String str = "friday";
String week1 = StringEnum.getWeek(str);//直接赋值String时类型检查不通过
String week2 = StringEnum.getWeek(StringEnum.FRIDAY);//赋值定义好的值时类型检查通过
}
}
以上知识点如果大家在学习的时候有任何疑问可以联系ZaLou.Cn小编补充分享。
- 完美世界战略投资多牛传媒,将联手打造泛娱乐媒体矩阵
- 数据恢复-SQL被注入攻击程序的应对策略
- MySQL数据库数据信息迁移
- NFS存储服务部署
- ssh服务、密钥登陆配置
- 本地yum仓库搭建及rpm软件包定制
- CentOS6.9-zabbix3.2启动失败原因及页面没有mysql选择项
- inotify软件部署及实时同步
- Linux下批量修改文件名方法
- Tomcat启动慢解决方法(本人CentOS7.4系统)
- Nginx软件部署配置过程
- iptables网络安全服务详细使用
- 未来哪个行业能赚钱,看百度、阿里、腾讯投资的企业你就知道了!
- Augmate公司应用分布式账本技术,将IOTA整合为物联网设备管理平台
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- HTML5标签2
- 浏览器
- CSS样式规则及字体样式
- 引入CSS样式表(书写位置)
- CSS复合选择器
- 不是吧,Serverless 还能这么玩?
- 这一行代码,能让你的 Python 运行速度提高 100 倍!
- 【52期】记一道简单的Java面试题,但答错率很高!
- 面向隐私 AI 的 TensorFlow 深度定制化实践
- 别再问如何用Python提取PDF内容了!
- gff文件转换成gtf文件
- R的save,load函数和 .rda文件
- 10行Python代码自动清理电脑内重复文件,解放双手!
- 【一天一大 lee】二叉树的后序遍历 (难度:中等) - Day20200929
- 一日一技:在Golang下如何相对简单地开发爬虫?