Java中定义常量几种方式
在开发中定义常量是很常见的事,但常量定义有哪几种方式可选?各种定义方式有什么优缺点?咱们就用这篇小文来梳理下^_^
1.通过接口Interface来定义(不推荐)
定义方式如下:
我们可以这样使用它:
这种定义方式的优点:
适合懒人使用,为什么呢?
我们知道,在interface中定义的常量默认是public static final类型的。所以我们定义String SUMMER = "Summner";的时候,就相当于默认加了public static final前缀,意思与public static final String SUMMER = "Summer";等价。
在接口中定义常量,可以免去加public static final几个单词,少敲几次键盘,但可以达到同样的效果。嗯,是挺方便的。
但是不推荐这种方式。张罗了几个原因,如下:
1)Java中设计出接口这种语法,就是为了用来实现或者继承的,如果我们在实现类或者子类接口中定义了同名的常量,那么子类接口或者实现类引用同名的常量,就可能不一致。是不是很容易造成混乱。
2)与接口的定义不相符,接口是一种规范,一种协议规定,主要用来定义必须要实现的API。用接口来定义常量,与创造接口的目的不相符,也有点杀鸡用牛刀,大财小用。
3)在interface中定义的常量属于编译型常量,每次更改常量值,都要重新编译所有引用到它的类。
举个小例子,我们将SUMMER常量更改为"Summer_Great"。编译Season后,我们看到接口Season中的SUMMER已经更改。
但是Test中的Season.SUMMER还是原值"Summer",没有改变,必须重新编译Test.java才行。
2.通过常量类来定义
我们知道一个类如果允许被继承,那么它定义的常量就有可能被子类覆盖,子类如果定义了同名的常量,就会造成子类和父类对同一个常量的定义不同,很容易造成困惑。所以呢,如果将一个类定义为常量类,那么这个类就不能允许被继承。所以呢,我们就有了以下两种定义常量类的方式。
1)将常量类定义为final类
2)将构造函数私有化
我们可以这样使用它:
这种方式最常用,但这种定义也是编译型常量,如果更改常量值的话,还是需要重新编译所有引用类。
3.增加static方法的常量类
那么怎么解决编译型常量这个问题呢?增加static方法。
我们可以这样使用它:
这样,如果改变了常量定义,只需要重新编译一下Season.java即可。
4.使用枚举类enum(推荐)
定义方式如下:
我们可以这样使用它:
枚举类限定了季节只能有春夏秋冬,不会引入其他什么季节,很安全;再者enum天生不允许被继承的,非常适合用作常量类。
时间不早了,该睡觉了,今天先讲到这儿了,下周继续开讲^_^。