Android使用注解代替枚举节省系统内存开销的方法

作者:飘杨...... 时间:2021-09-28 18:46:06 

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

标签:Android,注解,枚举,系统内存
0
投稿

猜你喜欢

  • mybatis QueryWrapper的条件构造之apply、last、select解析

    2022-02-12 17:32:51
  • Spring Security中使用authorizeRequests遇到的问题小结

    2023-10-07 04:23:45
  • Java负载均衡算法实现之轮询和加权轮询

    2023-07-16 15:27:17
  • 详解Android Studio安装ButterKnife插件(手动安装)

    2023-07-06 13:59:32
  • java微信红包实现算法

    2023-08-09 00:19:39
  • springboot实现文件上传步骤解析

    2023-01-31 22:15:42
  • Java使用DateTimeFormatter格式化输入的日期时间

    2023-03-09 04:52:38
  • Android入门之onTouchEvent触碰事件的示例详解

    2021-08-31 14:27:58
  • C#并行编程之信号量

    2023-10-08 19:26:54
  • Java实现Http工具类的封装操作示例

    2021-08-14 10:27:57
  • C#利用win32 Api 修改本地系统时间、获取硬盘序列号

    2021-11-23 06:52:24
  • c语言实现的几种常用排序算法

    2022-02-23 04:04:11
  • Java中的length和length()深入分析

    2022-01-23 06:33:01
  • vs2005中总是保留最近打开的项目和文件的记录

    2021-07-14 16:53:45
  • C++链表节点的添加和删除介绍

    2023-08-23 02:32:09
  • SpringBoot中JPA实现Sort排序的三种方式小结

    2022-02-12 23:35:12
  • 关于Jsoup将相对路径转为绝对路径的方法

    2022-03-11 04:13:50
  • C#中new操作符的工作机制

    2023-12-08 13:57:20
  • Android重要控件SnackBar使用方法详解

    2022-11-10 04:49:41
  • 利用spring的拦截器自定义缓存的实现实例代码

    2022-07-22 00:44:47
  • asp之家 软件编程 m.aspxhome.com