一.前言

在我们日常的开发过程中,我们经常定义使用常量;在Effective Java建议用枚举来替换常量的使用,提高我们代码的质量,总结一下枚举定义常量的基本使用

二.枚举类型说明

     1.枚举是一种数据类型,在jdk1.6版本才开始引入;

2.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内;

3.枚举定义了一组业务类型相同的成员且成员的语义清晰;

三.常量与枚举类型对比说明

常量存在问题:

1) 无法限制开发员继承/实现接口.

2) 开发员能够在子接口里继续添加常量.而这些常量可能得不到祖先层的支持.

3) 常量作为参数时,是String,int等弱类型,开发员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现.

4) 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能

5) 开发员在没有参考资料时,不可能知道某个int型的参数到底应该赋什么内容.

6) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值.

枚举解决了以上所有问题,主要体现在:

1) 私有构造函数,避免被继承和扩展.

2) 定义方法的参数时,必须用枚举常量类类型,如上面的EnumClassA类型,这样就转变成了强类型,不会出现弱类型引起的问题.

3) 常量值地址唯一,可以用==直接对比,性能会有提高.

4) 开发员可以根据该参数类型打开对应的类,从而找到定义的常量.

5) 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类.

四.枚举定义常量例子

public enum Color {

	/**
* 红色
*/
RED("1"), /**
* 黑色
*/
BANK("2"), /**
* 白色
*/
WHITH("3"); private String value; private Color(String value) {
this.value = value;
} public String getValue() {
return value;
} }

说明:这个小例子定义了几种颜色,红色、黑色、白色分别用1、2、3来表示。在我们的开发使用中就可以用equest调用枚举来进行判断比较操作,提高了复用性,方便修改以及管理提高代码的质量。

枚举常量属于稳态型 

使用常量接口,我们得对输入值进行检查,确定是否越界,如果常量非常庞大,校验输入就是一件非常麻烦的事情,但这是一个不可逃避的过程。

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类的四个实例。这也是我们看重枚举的地方:在编译期间限定类型,不允许发生越界的情况。

五.总结

   虽然枚举在很多方面都比接口常量和类常量好用,但是它有一点比不上接口常量和类常量的,就是继承,枚举类型是不能有继承的,也就是说一个枚举常量定义完毕后,除非修改重构,否则无法做扩展。

六、建议 

    在 项目开发中,推荐使用枚举常量代替接口常量或类常量。

  

Enum(枚举类型)的基本应用的更多相关文章

  1. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  2. enum枚举类型的定义

    enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, ...

  3. enum枚举类型的使用

    修饰符为public static enum,不用加final,否则提示错误. 枚举类的所有实例必须在枚举类中显式列出(,分隔,; 结尾).列出的实例系统会自动添加 public static fin ...

  4. C语言--enum,typedef enum 枚举类型详解

    原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...

  5. Java中的Enum枚举类型总结

    废话不多说,直接上代码,该例子来源于:http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html public enum Planet { ...

  6. C# Enum枚举类型操作扩展类

    使用示例: using System.ComponentModel; namespace SchoolEnterpriseManageSys.Enum { /// <summary> // ...

  7. Java enum枚举类型

    java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum En ...

  8. C++ enum 枚举类型

    1. 枚举类型浅谈 假设我们要设计一个打开文件的函数, 打开文件由三种状态: input, output 和 append. 不使用枚举, 我们可能会写出如下的代码 const int input = ...

  9. [小问题笔记(四)] Enum枚举类型转换为DataTable( C# )

    枚举: public enum ProductType { 小产品=, 大产品, 超大产品 } 转换方法: /// <summary> /// 枚举类型转化为DataTable /// & ...

  10. enum枚举类型

    枚举类型的实例是常量,且它们都用大写字母表示. 简单枚举例子: public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING } public cla ...

随机推荐

  1. 无废话ExtJs 入门教程四[表单:FormPanel]

    无废话ExtJs 入门教程四[表单:FormPanel] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在窗体里加了个表单.如下所示代码区的第28行位置,items:form. ...

  2. less2

    less2 @base-color: #000; @fore-color: darken(@base-color, 50%); @back-color: lighten(@base-color, 50 ...

  3. ASP.NET 5探险(1):Azure中配置连接字符串、独立项目执行EF7数据迁移

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:我开始把ASP.NET 5用于生产系统开发已经有1个多月了,也填了一些坑积累了一些经验,从今天开始会陆陆续 ...

  4. Zigzag

    date: 2015-09-24 21:09:00 Print Zigzag 思路: 1 首先是按行输出,每行输出相同位置的下一间隔为row*2-2,行游标0 初始化时(每一行的首个斜向部分),j=i ...

  5. unable to access android sdk add-on list

    在bin\properties里添加disable.android.first.run=true

  6. LVS 三种工作模式原理、以及优缺点比较(转载)

    原文地址:http://9ilinux.com/149.html 一.NAT模式(VS-NAT) 原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此R ...

  7. JAVA第三周作业

    一:枚举 package homework; public class EnumTest { public static void main(String[] args) { Size s=Size. ...

  8. Spring事务解析4-切面织入

    BeanFactoryTransactionAttributeSourceAdvisor作为Advisor的实现类,自然要遵从Advisor的处理方式,当代理被调用时会调用这个类的增强方法,也就是此b ...

  9. hdu1166 线段树

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  10. 2016.5.27 Kal系统安装到U盘的方法,U盘启动Kali

    本文我们聊一下如何把Kali Linux安装到移动硬盘或者U盘上,由移动硬盘独立引导,与本地系统完全隔离.U盘随身携带,只要PC的Bios支持USB启动,走到哪都可以使用自己的移动系统,方便工作和学习 ...