🍀 简介
静态常量什么时候适合放在类中?什么时候适合放在接口中?什么时候适合放在枚举中呢?放在不同的type中会引发什么不良后果呢?本篇就来解析一下~
🍀 方法 / 步骤
一: 放在 class 类中
public class classNo {
public static final int No1 = 100;
public static final int No2 = 200;
public static final int No3 = 300;
}
二: 放在 interface 中
public interface classNo {
public static final int No1 = 100;
public static final int No2 = 200;
public static final int No3 = 300;
}
二: 放在 enum (枚举)中
public enum ClassNo {
NO1(100,"一班"),
NO2(200,"二班"),
NO3(300,"三班");
private Integer code;
private String desc;
ClassNo(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
//getter setter
}
🍀 总结
- 常量类应该是final,不变的,而接口里的参数是final,也是不变的。
那么,看起来接口是放常量没有一定问题,还省去了final的输入,非常的合适。
但是,类是只能单继承的,接口是允许多实现的。
要是类实现的多个接口出现重名的常量,会报错,必须要在实现类明确常量用的是哪个接口的。
虽然这可以说是架构师设计的问题,但是,架构师这么做就违反了依赖倒转原则,这玩意就不细说了。
- 如果某个实现了常量接口的类被修改不再需要常量了,也会因为序列化兼容原因不得不保持该实现,而且非final类实现常量接口会导致所有子类被污染。
这个应该很少人遇到过,不过这是 Effective Java 里面说的。
具体的理解就是,能被序列化的一定是数据,
那么突然改了数据结构,可能导致老版的数据无法被反序列化,而新版的数据会有冗杂的数据,
要是折腾个几次,网络传输协议 这个无法通过时间或者空间提升的玩意就能逼死你了。
- 基于数据只暴露给相应的类的原则,一个类实现一个常量接口,可能只需要其中几个常量,而得到了更多无用的常量,所以使用常量接口的时候都是
❗❗❗ 综上:
- 接口是定义类型的,而不应该用于导出常量。
- 常量接口不建议使用,应使用常量类。
- 所以优先级别 枚举 >> 常量类 >> 接口(不建议)。