《编写高质量代码改善Java程序的151个建议》学习笔记 第6章 枚举和注解

建议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;
	           ...	
		}	
                   
	}
不用校验,已经限定了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值