前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的、安全性高的常量,那就力不从心了。例如以下几种情况,final结合static的方式便缺乏应对之策:
1、虽然常量的名称以大写字母拼写,但是对应的取值基本为1、2、3之类的整数,如果把1、2、3直接写在调用的代码里面,岂不是浑水摸鱼顶替了现有的常量蒙混过关?
2、代码可以从常量名推出对应的常量值,可是反过来并不能从常量值推出对应的常量名,开发者晓得不代表程序也晓得。
3、每个常量只有唯一的数值表达,无法表示更丰富的涵义。比如星期一这个常量,可能包括数字“1”、英文单词“Monday”、中文词语“星期一”这些信息组合,然而final联合static的方式只能表达其中一个信息。
听起来似乎言之有理,可是不用整型常量的话,还有什么常量类型能派上用场呢?其实Java语言在设计之初就考虑到了这种情况,在之前的学习当中,已经出现过类似的处理方案。早在介绍本地日期类型LocalDate的时候,提到获取当前月份的办法是调用日期实例的getMonthValue方法,为啥这里不是调用getMonth方法?原来getMonth方法返回的并非整型数值,而是一个Month类型的月份实例,它属于枚举类型。调用该实例的getValue方法,得到的才是月份数字;调用该实例的name方法,可得到大写英文月份的英文单词。先来看看以下的一段月份测试代码:
// 演示Month类型的调用方式。注意,Month类型是Java自带的一种枚举类型
private static void testMonth() {
LocalDate date = LocalDate.now();
Month month =