建议83 :推荐使用枚举定义常量
在JAVA1.5之前,我们有两种方式的声明:类常量和接口常量
在JAVA1.5之后,新增了一种常量声明方式:枚举声明常量,看如下代码:
enum Season{
Spring,Summer,Autumn,Winter;
}
JLS(Java Language Specification,Java语言规范)提倡枚举项全部大写,字母之间用下划线分隔。
枚举的优点主要有以下四个方面
1) 枚举常量更简单
先把Season枚举翻写成接口常量,代码如下:
interface Season{
int Spring = 0;
int Summer = 1;
int Autumn = 2;
int Winter = 3;
}
此处定义了春夏秋冬四个季节,类型都是int,这与Season枚举的排序值是相同的。首先对比一下两者的定义,枚举常量只需要定义每个枚举项,不需要定义枚举值,而接口常量(或类常量)则必须定义值,否则编译不过,即使我们不需要关注其值是多少也必须定义;其次,虽然两者被引用的方式相同(都是“类名.属性”,“Season.Spring”),但是枚举表示的是一个枚举项,字面含义是春天,而接口常量却是一个int类型,虽然字面意思也是春天,但在运算中我们势必要关注其int值。
2)枚举常量属于稳态型
例如,我们要给外星人描述一下地球上的春夏秋冬是什么样子的,使用接口常量应该是这样写。
public void describe(int s){
//s变量不能超越边界,校验条件
if(s>=0 && s<4){
switch(s){
case Season.Summer:
System.out.println("Summer is very hot!");
break;
case Season.Winter:
System.out.println("Summer is very hot!");
break;
...
}
}
}
问题是我们得对输入值进行检查,确定是否越界,如果常量非常庞大,校验输入就成了一件非常麻烦的事情,我们再来看看枚举常量是否能够避免校验问题,代码如下:
public void describe(Season s ){
switch(s){
case Summer:
System.out.println(Season.Summer+"is very hot");
break;
case Winter:
System.out.println(Season.Winter+"is very cold");
break;
...
}
}
不用校验,已经限定了