1700445787
1700445788
1700445789
1700445790
1700445792
编写高质量代码:改善Java程序的151个建议 建议83:推荐使用枚举定义常量
1700445793
1700445794
常量声明是每一个项目都不可或缺的,在Java 1.5之前,我们只有两种方式的声明:类常量和接口常量,若在项目中使用的是Java 1.5之前的版本基本上都是如此定义的。不过,在1.5版以后有了改进,即新增了一种常量声明方式:枚举声明常量,看如下代码:
1700445795
1700445796
enum Season{
1700445797
1700445798
Spring, Summer, Autumn, Winter;
1700445799
1700445800
}
1700445801
1700445802
这是一个简单的枚举常量命名,清晰又简单。顺便提一句,JLS(Java Language Specification, Java语言规范)提倡枚举项全部大写,字母之间用下划线分隔,这也是从常量的角度考虑的(当然,使用类似类名的命名方式也是比较友好的)。
1700445803
1700445804
可能有读者要问了:枚举常量与我们经常使用的类常量和静态常量相比有什么优势?问得好,枚举的优点主要表现在以下四个方面。
1700445805
1700445806
(1)枚举常量更简单
1700445807
1700445808
简不简单,我们来对比一下两者的定义和使用情况就知道了。先把Season枚举翻写成接口常量,代码如下:
1700445809
1700445810
interface Season{
1700445811
1700445812
int Spring=0;
1700445813
1700445814
int Summer=1;
1700445815
1700445816
int Autumn=2;
1700445817
1700445818
int Winter=3;
1700445819
1700445820
}
1700445821
1700445822
此处定义了春夏秋冬四个季节,类型都是int,这与Season枚举的排序值是相同的。首先对比一下两者的定义,枚举常量只需要定义每个枚举项,不需要定义枚举值,而接口常量(或类常量)则必须定义值,否则编译通不过,即使我们不需要关注其值是多少也必须定义;其次,虽然两者被引用的方式相同(都是“类名.属性”,如Season.Spring),但是枚举表示的是一个枚举项,字面含义是春天,而接口常量却是一个int类型,虽然其字面含义也是春天,但在运算中我们势必要关注其int值。
1700445823
1700445824
(2)枚举常量属于稳态型
1700445825
1700445826
例如,我们要给外星人描述一下地球上的春夏秋冬是什么样子的,使用接口常量应该是这样写。
1700445827
1700445828
public void describe(int s){
1700445829
1700445830
//s变量不能超越边界,校验条件
1700445831
1700445832
if(s>=0&&s<4){
1700445833
1700445834
switch(s){
1700445835
1700445836
case Season.Summer:
[
上一页 ]
[ :1.700445787e+09 ]
[
下一页 ]