使用注解替代枚举

本文介绍了如何通过@IntDef和@StringDef注解来增强类型安全性,减少枚举带来的内存消耗。这两种注解在Java中用于限制变量只能接受特定的int值或字符串值,提供编译时检查,但不支持Kotlin。使用注解可以在编译阶段发现错误,避免运行时异常,同时避免了枚举的额外内存开销。在实际应用中,注解适合于简单的类型安全场景,而对于复杂映射关系,仍需枚举或其他数据结构。
摘要由CSDN通过智能技术生成

概述

使用枚举Enum能确保类型安全,但往往会加大内存消耗,因为Enum中的枚举值是静态成员对象,相对于静态常量占用更多的内存空间。google官方在很早以前就提醒尽量少的使用枚举,并提供了注解的方式来检查类型安全,目前提供了@IntDef@StringDef这两种注解方式。

注解

一、@IntDef
定义注解,添加常量
@IntDef(value = {AnnotationStatus.TYPE_ONE, AnnotationStatus.TYPE_TWO})
@Retention(RetentionPolicy.SOURCE)
public @interface AnnotationStatus {
    int TYPE_ONE = 0;
    int TYPE_TWO = 1;
}

和接口一样,注解中的常量的类型也是public static final修饰的。
@Retention注解有三种类型,SOURCECLASSRUNTIME

  • SOURCE表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中。
  • CLASS表示注解的信息被保留在class文件(字节码文件)中,当程序编译时,但不会被虚拟机读取在运行的时候。
  • RUNTIME表示注解的信息被保留在class文件(字节码文件)中,当程序编译时,会被虚拟机保留在运行时。

@IntDef用于限定可使用的int值

使用
@AnnotationStatus
private var property: Int = AnnotationStatus.TYPE_ONE

private fun setProperty(@AnnotationStatus prop: Int) {
    this.property = prop
}

setProperty方法参数使用@AnnotationStatus进行了注解,如果传入一个非@IntDef中定义的成员,则编译器lint检查会给予警告。
在这里插入图片描述

Must be one of: AnnotationStatus.TYPE_ONE, AnnotationStatus.TYPE_TWO

二、@StringDef

@IntDef的定义和使用类似,以下是完整代码:

@StringDef({AnnotationStrStatus.SUCCESS, AnnotationStrStatus.ERROR, AnnotationStrStatus.UNKNOWN})
@Retention(RetentionPolicy.SOURCE)
public @interface AnnotationStrStatus {
    String SUCCESS = "success";
    String ERROR = "error";
    String UNKNOWN = "unknown";
}
@AnnotationStrStatus
private var requestStatus = AnnotationStrStatus.SUCCESS

private fun setRequestStatus(@AnnotationStrStatus reqStatus:String){
  this.requestStatus = reqStatus
}

在属性上定义非注解限定之外的值,编译器报错提示:
在这里插入图片描述

注意:

一、kotlin定义的注解不起作用,查到以下资料,所以以上使用的定义的注解我都是用java写的

As of Kotlin 1.0.3, the @IntDef annotation is not supported, but support is planned for later versions.
The Kotlin way of making these compile time checks is to use an enum class instead of a series of Int constants.

二、对属性初始赋值可以进行限定,但二次赋值限定会失效(又或许是我哪没处理好==),目前处理是使用方法来进行属性赋值限定类型
在这里插入图片描述
三、对于有多个对应关系的还是需要使用枚举处理,注解方式处理不了,如Color(color_red,0,0xffffff)

四、@IntDef@StringDef注解只是类型安全检查,在报错提示下强行运行,程序并不会发生发生闪退,实质上这两个注解就是用来约束规范的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值