接口常量:
public interface Sex {
String MAN = "男";
String WOMAN = "女";
}
枚举:
public enum Sex {
MAN("男"),WOMAN("女");
private String sex;
Sex(String sex){
this.sex = sex;
}
@Override
public String toString() {
return this.sex;
}
两者都可以实现 类名.属性 的形式调用常量。两者有什么区别呢?
接口常量:
-
接口常量(或类常量)必须定义值,否则编译通不过
-
无法限制开发员继承/实现接口
-
开发员能够在子接口里继续添加常量,而这些常量可能得不到祖先层的支持.
-
常量作为参数时,是String,int等弱类型,开发员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现
-
由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能
-
开发员在没有参考资料时,不可能知道某个int型的参数到底应该赋什么内容
-
编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值
枚举:
-
枚举只需要定义每个枚举项,不需要定义枚举值,表示的是一个枚举项。
-
枚举具有内置方法 每个枚举都是java.lang.Enum的子类,该基类提供了诸如获得排序值的ordinal方法、compareTo比较方法等,大大简化了常量的访问。
-
枚举作为参数使用时可以在编译时避免弱类型错误,而常量类中的常量作为参数使用时在编译时无法避免弱类型错误(譬如常量类型为 int,参数传递一个常量类中没定义的 int 值)。
虽然接口常量也能实现 类名.属性 但由于继承,弱类型等原因,使用枚举类型更方便一点。