接口常量、类常量、枚举类
一、分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量。不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量。代码如下: enum Season{ Spring,Summer,Autumn,Winter; }
二、场景 那么枚举常量与我们的经常使用的类常量和静态常量比有什么优势呢?
1.枚举常量更简单 先把Season枚举翻译成接口,代码如下: interface Season{ int Sprint = 0; int Summer = 1; int Autumn = 2; int Winter = 3; }
枚举只需要定义每个枚举项,不需要定义枚举值,而接口常量(或类常量)则必须定义值,否则编译通不过;两个引用的方式相同(都是“类名.属性”,如Season.Sprint),但是枚举表示的是一个枚举项,字面含义是春天,而接口常量却是 一个Int类型。
2.枚举常量属于稳态型 使用常量接口,我们得对输入值进行检查,确定是否越界,如果常量非常庞大,校验输入就是一件非常麻烦的事情,但这是一个不可逃避的过程。
接口常量
public interface ConstInterfaceA { public static final String CONST_A = "aa"; public static final String CONST_C = "ac"; }
存在问题:
1) 无法限制开发员继承/实现接口.
2) 开发员能够在子接口里继续添加常量.而这些常量可能得不到祖先层的支持.
3) 常量作为参数时,是String,int等弱类型,开发员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现.
4) 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能
5) 开发员在没有参考资料时,不可能知道某个int型的参数到底应该赋什么内容.
6) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值.
类常量
public class ConstClass { private static final String Success = "成功"; private static final String Fail = "失败"; }
1、JDK编译时,直接把常量编译到使用的地方。在修改变量值后,其它类有可能会出现编译到旧常量值的问题。
2、只能用equals比较,性能较低。无法保证类型是否合法,限定类型值。
3、如果使用了private,限定了只能当前类的拥有者才可以修改,如果使用public,则子类可以继承修改,父类并不知情
枚举常量
public enum Day { YICODE(1), ERCODE(2), YIMESSAGE("星期一"), ERMESSAGE("星期二"), XINGQI_YI(001,"星期一"), XINGQI_ER(002,"星期二"), XINGQI_SAN(003,"星期三"), XINGQI_SI(004,"星期四"), XINGQI_WU(005,"星期五"), XINGQI_LIU(006,"星期六"), XINGQI_RI(007,"星期日"); private int code; private String massage; Day(int code, String message){ this.code=code; this.massage=message; } Day(int code){ this.code=code; } Day(String message){ this.massage=message; } public int getCode() { return code; } public String getMassage() { return massage; } }
1、类型限定,性能较高,推荐使用。
2、枚举构造方法是私有的,无法继承修改,默认私有化无参构造方法,可用于枚举单例
常量和枚举区别
注意:很自然,枚举会更加的简洁明了. 而且枚举支持 == 比较 switch case 等操作. 而且可以自己封装方法. 所以个人认为枚举确实好一些.
为什么枚举支持 == 比较,而常量不支持呐?
因为final的变量地址值是不可变的。