【每日一思】Java使用注解限制类型

520 阅读2分钟

Java使用注解代替枚举

注解:好用且能装逼

问题起因

今天在封装一个项目中的view时,需要处理两种类型的图片,这就引出了开发中常见的两个问题。

1、用什么来标识类型A和类型B,枚举?常量?

2、如何使用注解规范类型的使用?

在学习了项目里面一些好的例子后,总结下面两个结论,也刚好回答了上面两个问题

减少枚举使用

刚学习java的人,可能首先想到的就是枚举,这好像是Java专门设计出来给我们做类型用的。

但是Android 官网不建议使用枚举,因为枚举占用的内存会超过普通常量的2倍及以上。而且枚举生成的字节码 size 也是 普通常量的 13倍之多。

下面是三种常用的方法

// 使用类常量
public class constants{
    public static final int VALUE1 =1;
    public static final int VALUE2 =2;
    public static final int VALUE3 =3;
}

// 2:使用接口常量
public interface constants{
    int VALUE1 =1;
    int VALUE2 =1;
    int VALUE3 =1;
}

//3: 使用枚举
public static enum Value{
    VALUE1,
    VALUE2,
    VALUE3
}

以上三种方式,最建议使用接口常量,字节码最少,内存也最少,代码看起来更简单和清晰

使用注解规范类型的使用

首先在定义接口常量的地方加上两个注解,第一个注解限制了只能使用对应类型的值,第二个注解说明这部分内容会在编译时被扔掉(这里不详细说注解的知识点了)。

@IntDef({Type.TYPE1, Type.TYPE2})
@Retention(RetentionPolicy.SOURCE)
@interface Type{
    int TYPE1 = 1;
    int TYPE2 = 2;
}

这样做有一个好处,在使用这个类型接口的人调用下面方法时,如果传入的type值不是1和2,写代码时就会直接报红,防止了错误的类型传入(但是这可以编译运行通过)。

public void setType(@Type int type) {
    xxxx;
}

好久没更新了,一直很忙,每日一思还是简单点,想到啥写啥,不要花太多时间。后面希望能更新稳定下来,每篇文章限制在300字以内,简单明了,不求甚解。