援引

Typesafe Enums - This flexible object-oriented enumerated type facility allows you to create enumerated types with arbitrary methods and fields. It provides all the benefits of the Typesafe Enum pattern ("Effective Java," Item 21) without the verbosity and the error-proneness.

为什么要有枚举

问题:要定义星期几或性别的变量,该怎么定义?

假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。

枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

用普通类如何实现枚举功能

定义一个Weekday的类来模拟枚举功能

思路:

将构造函数私有

将确定的每个元素静态修饰

如果有方法对于每个元素实现过程都不同,则将该方法定义成抽象方法,这样避免了定义成静态方法后大量的if-else操作判断元素

   1: public abstract class Weekdays {

   2:     private String name;

   3:     

   4:     //设置成静态成员,通过类名调用每个元素

   5:     public static final Weekdays MONDAY = new Weekdays("MONDAY"){

   6:         @Override

   7:         public Weekdays getNextDay() {

   8:             // TODO Auto-generated method stub

   9:             return Weekdays.TUESDAY;

  10:         }

  11:     };

  12:     public static final Weekdays TUESDAY = new Weekdays("TUESDAY"){

  13:         @Override

  14:         public Weekdays getNextDay() {

  15:             // TODO Auto-generated method stub

  16:             return Weekdays.MONDAY;

  17:         }

  18:     };

  19:     

  20:     //私有构造函数,保证不能创建新的实例对象

  21:     private Weekdays(String name){

  22:         this.name = name;

  23:     }

  24:     

  25:     //抽象该方法,通过每个元素自己实现其细节

  26:     abstract Weekdays getNextDay();

  27:     

  28:     @Override

  29:     public String toString() {

  30:         // TODO Auto-generated method stub

  31:         return this.name;

  32:     }

  33:     

  34:     //此处表示不抽象该方法的实现方法

  35:     //可以看到会出现大量的if else

  36:     //非常繁琐

  37:     /*public Weekdays nextDay(){

  38:         if(this == MONDAY){

  39:             return TUESDAY;

  40:         }

  41:         else if(this == TUESDAY){

  42:             return MONDAY;

  43:         }

  44:         return null;

  45:     }*/

  46: }

枚举的实现以及作用

那么上面的例子中用普通类实现枚举类显得非常的繁琐,JDK1.5提供了枚举功能,使这样的定义简单方便

通过枚举实现Weekdays

   1: public enum Weekday {

   2:     MONDAY("MONDAY"){

   3:         @Override

   4:         public Weekday nextDay() {

   5:             // TODO Auto-generated method stub

   6:             return TUESDAY;

   7:         }

   8:     },

   9:     TUESDAY("TUESDAY"){

  10:         @Override

  11:         public Weekday nextDay() {

  12:             // TODO Auto-generated method stub

  13:             return MONDAY;

  14:         }

  15:     };

  16:     private String name;

  17:     

  18:     Weekday(String name){

  19:         this.name = name;

  20:     }

  21:     

  22:     public abstract Weekday nextDay();

  23:     

  24:     @Override

  25:     public String toString(){

  26:         return this.name;

  27:     }

  28: }

 

枚举的特点

 
枚举就相当于一个特殊的类,其中每个元素都是一个实例对象

其中也可以定义构造方法、成员变量、普通方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。

带构造函数的枚举:

构造方法必须定义成私有的

通过MONDAY(Var1,Var2)这种形式实现

枚举元素MONDAY和MONDAY()的效果一样,都是调用默认的构造方法。

带普通方法的枚举:

每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。

带有抽象方法的枚举:

通过每个子类元素自己实现,通过MONDAY(){ @Override method }形式实现

JDK1.5新特性(五)……Typesafe Enums的更多相关文章

  1. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  2. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  3. JDK1.7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  4. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  5. JDK1.8 新特性

    jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...

  6. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  7. JDK1.7新特性(2):异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

  8. jdk1.8新特性应用之Iterable

    我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...

  9. jdk1.8新特性之方法引用

    方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...

随机推荐

  1. 1031: [JSOI2007]字符加密Cipher - BZOJ

    Description喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: ...

  2. zoj 3329 One Person Game 概率DP

    思路:这题的递推方程有点麻烦!! dp[i]表示分数为i的期望步数,p[k]表示得分为k的概率,p0表示回到0的概率: dp[i]=Σ(p[k]*dp[i+k])+dp[0]*p0+1 设dp[i]= ...

  3. C++对象的自销毁

    记得在学校里的时候,曾经这样写过: void MyClass::KillMe() { delete this; } 老师看到这句话的时候,眼珠子都快瞪出来了.但是运行正确啊,没什么问题. 现在想起来, ...

  4. Frequent values && Ping pong

    Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...

  5. centos安装异常解决方法

    VMware系统安装Centos7后,第一次启动出现以下异常信息: Initial setup of CentOS Linux (core) ) [x] Creat user ) [!] Licens ...

  6. hadoop2.2.0安装

    64位编译和安装 http://blog.csdn.net/licongcong_0224/article/details/12972889 http://blog.csdn.net/w1377026 ...

  7. 统计学习方法笔记--EM算法--三硬币例子补充

    本文,意在说明<统计学习方法>第九章EM算法的三硬币例子,公式(9.5-9.6如何而来) 下面是(公式9.5-9.8)的说明, 本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流 ...

  8. Java之数组array和集合list、set、map

    之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊,直到看到了这篇文章,讲解的很清楚. 世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合 ...

  9. mvn命令

    打包:mvn package 编译:mvn compile 编译测试程序:mvn test-compile 清空:mvn clean 运行测试:mvn test 生成站点目录: mvn site 生成 ...

  10. Codeforces 364A - Matrix

    原题地址:http://codeforces.com/problemset/problem/364/A 题目大意: 给定一个数字a(0 ≤ a ≤ 109)和一个数列s(每个数都是一位,长度不超过40 ...