关于常量的管理

最近看某个开源库的时候,看到它的常量管理是用的多个常量接口,根据用途的不同定义各自的接口类。看上去很优雅的样子。平时在项目中,常量的用处很多,比如一些缓存KEY,某些返回CODE等,一般操作都是定义一个/多个常量类进行管理,并没有过多考虑,可能根据个人习惯,写法也大同小异。

于是查了一下,看下网上大家对这两种常量的管理有哪些讨论,没想到还是有些东西的。
由于 java interface 中声明的字段在编译时会自动加上static final的修饰符,即声明为常量,因此很多人认为这里是放置常量的最佳地方。至于为什么接口中的“申明的普通变量”会设计成自动变成静态常量,因为Java语言中,接口就是一些协议的定义,它不能够包含任何的实现,为了避免实现类去修改这个协议,所以它必须被声明为final,又因为接口不能够被实例化,所以只有通过声明为static才能访问。不过,顺便谈一句,Java8之后接口可以添加默认方法也可以有静态带实现的方法。个人感觉这使得接口仅仅作为协议的界限变得模糊,有点类似抽象类了。
部分人认为常量不该放在接口的原因,是因为如果某个实现了常量接口的类被修改不再需要该常量了,会因为序列化兼容原因不得不保持该实现,那么在维护该项目的时候,这些常量成为了冗余数据又无法被删除,而且非final类实现常量接口会导致所有子类被污染。
大家普遍认为这样是最为严谨的写法:

public final class Constants {

    private Constants() {

    }

    public static final int CODE1 = 1;
    public static final int CODE2 = 2;
}

这样的常量类无法被继承,也无法实例化。
不过我觉得如果该接口仅仅是作为常量接口进行使用,并不会有任何实现类,用接口分类管理某些常量这种做法还是很好。

哈哈看完这些讨论,有一种ctrl+c+v的感觉..