Android使用注解代替枚举节省系统内存开销的方法
作者:飘杨...... 发布时间:2021-09-28 18:46:06
标签: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);//赋值定义好的值时类型检查通过
}
}
以上知识点如果大家在学习的时候有任何疑问可以联系脚本之家小编补充分享。
来源:https://www.cnblogs.com/tony-yang-flutter/p/12244233.html


猜你喜欢
- 我们都知道mybatis在进行参数判断的时候,直接可以用<if test=""></if> 就可
- TabLayout+ViewPager实现tab和页面联动效果xml中:<?xml version="1.0" e
- 本文实例为大家分享了java指定精确小数位的具体代码,供大家参考,具体内容如下java代码:public class App2 {publi
- 前言Graalvm通过静态分析提前编译来为Java应用程序构建高度优化的本机可执行文件,这就需要在编译时就知道所有的程序类型,而java中的
- 用户列表页面开发项目介绍用户列表页面开发,可以实现简单的查询,删除,修改,和添加用户信息功能。前端使用vue框架,后端使用springboo
- 在android移动端的开发中,首页轮播图是一个特别常见的功能,所以今天就来将最近写的一个小demo记录一下。首先当然是新建一个项目代码如下
- 需求描述:企业开发过程中,经常需要将一些静态文本数据放到Resources目录下,项目启动时或者程序运行
- 通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等
- 前言 SQLite是一种轻量级的小型数据库,虽然比较小,但是功能相对比较完善,一些常见的数据库基本功能也具有,在现在的嵌入式系统中使用该数据
- 本文实例讲述了C#开发的人脸左右相似度计算软件。分享给大家供大家参考。具体分析如下:模仿湖南卫视快乐大本营中所使用的一款人脸左右对称相似度计
- 1.IO流介绍IO流可以用到的地方很多,就比如设计模式、下载、传输等等。学好IO流,为之后的进一步学习打下基础,那么,先来说说什么是流?流是
- TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的ListView组件使用,因为Li
- 1.创建一个带Mesh的物体Unity中的网格作为组件不能脱离物体单独存在新建脚本CreateMeshpublic class Create
- 水平的ListView-HorizontalListView的使用Android中ListView默认的是竖直方向的滑动,由于项目的需求,需
- 序言:此前,我们主要通过XML来书写SQL和填补对象映射关系。在SpringBoot中我们可以通过注解来快速编写SQL并实现数据访问。(仅需
- 1 使用阿里的FastJson1.1 项目的pom.xml依赖<dependency> <groupId>com.a
- 本文实例总结了Java JDBC连接数据库常见操作。分享给大家供大家参考,具体如下:db.properties配置文件(MySql数据库)#
- 之前一段时间,在朋友的推荐下,玩了探探这一款软件,初玩的时候,就发现,这款软件与一般的社交软件如陌陌之类的大相径庭,让我耳目一新,特别是探探
- 学习背景进入正文学习字符串的intern()方法之前,先给下这4个问题,看下自己是否都知道答案?1、String s1 = “a” + “b
- 本文实例为大家分享了Java网络编程TCP程序设计的具体代码,供大家参考,具体内容如下[1] TCP编程的主要步骤客户端(client):1