提高Java代码质量:使用枚举定义常量(转)
一、分析  
常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量。不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量。代码如下:
enum Season{
    Spring,Summer,Autumn,Winter;
} 
二、场景  
那么枚举常量与我们的经常使用的类常量和静态常量比有什么优势呢?  
1.枚举常量更简单  
先把Season枚举翻译成接口,代码如下:
interface Season{
    int Sprint = 0;
    int Summer = 1;
    int Autumn = 2;
    int Winter = 3;
} 
枚举只需要定义每个枚举项,不需要定义枚举值,而接口常量(或类常量)则必须定义值,否则编译通不过;两个引用的方式相同(都是“类名.属性”,如Season.Sprint),但是枚举表示的是一个枚举项,字面含义是春天,而接口常量却是一个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("Winter is very cold!");
                break;
        …..
        }
    }
} 
我们再来看看枚举常量是否能够避免校验问题,代码如下:
public void describe(Season s){
    switch(s){
        case Season.Summer:
            System.out.println("Summer is very hot!");
            break;
        case Season.Winter:
            System.out.println("Winter is very cold!");
            break;
        …...
    }
} 
不用校验,已经限定了是Season枚举,所以只能是Season类的四个实例。这也是我们看重枚举的地方:在编译期间限定类型,不允许发生越界的情况。  
3.枚举具有内置方法  
每个枚举都是java.lang.Enum的子类,该基类提供了诸如获得排序值的ordinal方法、compareTo比较方法等,大大简化了常量的访问。比如,列出所有枚举值:
public static void main(String[] args){
    for(Season s:Season.values()){
        System.out.println(s);
    }
} 
4.枚举可以自定义方法  
这一点似乎不是枚举的优点,类常量也可以有自己的方法,但关键是枚举常量不仅仅可以定义静态方法,还可以定义非静态方法,而且还能够从根本上杜绝常量类被实例化。比如我们在定义获取最舒服的季节,使用枚举的代码如下:
enum Season{
    Spring,Summer,Autumn,Winter;
    //最舒服的季节
    public static Season getComfortableSeason(){
        return Spring;
    }
} 
那如果是使用类常量如何实现呢?如下:
class Season{
    public final static int Spring = 0;
    public final static int Summer = 1;
    public final static int Autumn = 2;
    public final static int Winter = 3; 
    //最舒服的季节
    public static int getComfortableSeason(){
        return Spring;
    }
} 
虽然枚举在很多方面都比接口常量和类常量好用,但是它有一点比不上接口常量和类常量的,就是继承,枚举类型是不能有继承的,也就是说一个枚举常量定义完毕后,除非修改重构,否则无法做扩展。  
三、建议  
在项目开发中,推荐使用枚举常量代替接口常量或类常量。
提高Java代码质量:使用枚举定义常量(转)的更多相关文章
- [改善Java代码]推荐使用枚举定义常量
		
枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或 ...
 - 提高Java代码质量的Eclipse插件之Checkstyle的使用详解
		
提高Java代码质量的Eclipse插件之Checkstyle的使用详解 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代 ...
 - 提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释
		
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发者遵守某些编码规范的工具.它可以自己主动化代码规范检查过程.从而使得开发者从这项重要可是枯燥的任务中解脱出来. Ch ...
 - 拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
		
提高你的Java代码质量吧:推荐使用枚举定义常量 一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一 ...
 - 提高你的Java代码质量吧:小心switch带来的空值异常
		
一.分析 使用枚举定义常量时,会有伴有大量的switch语句判断,目的是为每个枚举解释其行为. 我们知道,目前的Java的switch语句只能判断byte.short.char.int类型(JDK7 ...
 - 提高Objective-C代码质量心机一:简化写法
		
提高OC代码质量的小心机 一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期 ...
 - Java 性能优化手册 — 提高 Java 代码性能的各种技巧
		
转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...
 - 提高你的Java代码质量吧:使用构造函数协助描述枚举项
		
一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性. 二.场景 比如,可以通过枚举构造函数声明业务值,定 ...
 - 提高 Android 代码质量的4个工具
		
在这篇文章中,我将通过不同的自动化工具如CheckStyle,FindBugs,PMD以及Android Lint来介绍(如何)提高你的安卓代码质量.通过自动化的方式检查你的代码非常有用,尤其当你在一 ...
 
随机推荐
- Vue.js双向绑定的实现原理和模板引擎实现原理(##########################################)
			
Vue.js双向绑定的实现原理 解析 神奇的 Object.defineProperty 这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.obser ...
 - 用distinct在MySQL中查询多条不重复记录值[转]
			
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所 ...
 - Atitit.html css  浏览器原理理论概论导论attilax总结
			
Atitit.html css 浏览器原理理论概论导论attilax总结 1.1. 浏览器是怎样工作的:渲染引擎,HTML解析(连载二)1 2. 5.1.1 DOM标准 1011 3. <We ...
 - paip. dsl 编程语言优点以及  常见的dsl
			
paip. dsl 编程语言优点以及 常见的dsl 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn. ...
 - js脚本语言基础和数组
			
js和PHP中,字符串赋值:要使用"双引号"或"单引号"引起来:例如:var c="你好"不同类型进行数学运算,要转换,类型转换:强制转换p ...
 - python web框架——初识tornado
			
一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...
 - hdu4508 完全背包,湫湫系列故事——减肥记I
			
湫湫系列故事——减肥记I 对于01背包和完全背包,昨晚快睡着的时候,突然就来了灵感 区别:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值 在第二重循环,01 是倒着循环的,因 ...
 - UVa 10387- Billiard
			
UVa 10387- Billiard Table of Contents 1 题目 2 思路 3 代码 4 参考 1 题目 ============= Problem A: Billiard In ...
 - 销傲销售过程GSP管理系统功能概述
			
1 公司介绍 西安海思威软件有限公司于2009年2月注册成立,海思威软件公司隶属于海思威集团,位于交通十分便利的西安经济技术开发区.公司致力于中国本土式销售管理的研究与管理软件产品的开发,是 ...
 - ACPI I/O resource conflict with SMBus
			
ACPI I/O resource conflict with SMBus 以電子郵件傳送這篇文章BlogThis!分享至 Twitter分享至 Facebook分享到 Pinterest 這幾天遇到 ...