JDK 5.0(Tiger)中的一些新特性(2):枚举mingxing - 凯时娱乐

JDK 5.0(Tiger)中的一些新特性(2):枚举mingxing

2019-02-10 08:16:20 | 作者: 鸿祯 | 标签: 枚举,类型,运用 | 浏览: 2392

Last modified:2013-04-06 23:56:12

**********************************************

 

枚举类型

枚举类型:界说一种类型变量,它指向的值都是固定的。这些值称作枚举的元素,这些元素可所以这个枚举类或许其子类的一个实例目标。该类型的取值只可所以这些元素和null。

 

在没有枚举类型曾经咱们是怎样完结枚举的功用的呢?

 

下面是咱们模仿枚举类型的一个案例:

 

public abstract class WeekDay1 {
 private WeekDay1() {
 public final static WeekDay1 SUN = new WeekDay1() {
 @Override
 public WeekDay1 nextDay() {
 return MON;
 public static final WeekDay1 MON = new WeekDay1() {
 @Override
 public WeekDay1 nextDay() {
 return MON;
 public abstract WeekDay1 nextDay();
 public String toString() {
 return this  SUN ? "SUN" : "MON";
 JDK 5.0后,咱们能够怎样做:
 public enum WeekDay {
 SUN, MON, TUE, WED, THU, FRI, SAT
 }

 

 就像类和接口相同,enum关键字界说了一个新的引证类型。这些值就像static final字段相同(这就是为什么它们的称号一般用都大写来表明),WeekDay能够被指定为这七个值中的恣意一个和null,可是不能是其他值。

 

考虑:在刚接触到枚举的时分我很不解,已然咱们能够自己结构一个和枚举功用适当的类,那么JDK在枚举的晋级是不是就是简化操作和代码的晋级呢?其实否则,简化操作是一方面,其实更重要的是供给了类型安全性。在5.0之前,咱们会或许会运用int 型的1来表明SUN,剩余的以此类推,可是当咱们运用weekday时,给一个weekday变量赋值的时分咱们假如赋予的是一个大于7的值,那么编译是不会报错的。

 

5.0曾经:

public static final int SUN = 1;

假如咱们在别的一个当地引证SUN时:

正确的:int day = WeekDay.SUN;

过错但不会报错:int day = 45;

假如打印某个枚举类型,打印出来的就是枚举的字符串自身,与name()办法取得的相同。

 

下面是交通灯的一个枚举案例:

public enum TrafficLamp {
 Red(25) {
 @Override
 public TrafficLamp nextLamp() {
 return Green;
 Yellow(5) {
 @Override
 public TrafficLamp nextLamp() {
 return Red;
 Green(30) {
 @Override
 public TrafficLamp nextLamp() {
 return Yellow;
 public abstract TrafficLamp nextLamp();
 @SuppressWarnings("unused")
 private int time;
 //enum的结构办法有必要私有
 private TrafficLamp(int time) {
 this.time = time;
 } 

 

留意考虑:枚举只要一个成员时,就能够作为单例的完结方法。

 

下面是引自《Java in a Nutsbell》中有必要知道的enum特性,以了解及更有力的运用它们:

1. 枚举没有公共的结构函数,枚举类型仅有的实例就是这些枚举声明。

 

2. 枚举类型不是Cloneable,所以无法为现有的实例创立副本。

 

3. 枚举类型完结了java.io.Serializable,所以它们能够被序列化,但java的序列化机制会特别处理它们,以保证不会有新的实例被创立。

 

4. 枚举类型的实例是永久都不会变的:每一个枚举类型值都会保存它自己的特性。

 

5. 枚举类型的实例是存储于类型自身的public static final字段里,由于这些字段为final,所以它们不或许被不恰当的值改写。

 

6. 按照常规,枚举类型的值都是运用大写字母来编写,就和其他static final字段相同。

 

7. 由于有一个严厉约束的具有不同枚举值的调集,所以运用“”运算符比较枚举值来替代调用equals() Method 一定是安全的。

 

8. 但是,枚举调集的确有个可行的equals() method。该method在内部运用并且他被界说为final,所以他无法被掩盖。这个可行的equals() method答应枚举值被用作相似Set、List与Map Collection的成员。

 

9. 枚举类型有个可行的hashCode() method,与它们的equals() method共同。和equals()相同,hashCode()也被界说为final的。它答应枚举值合作相似java.util.HashMap这样的类一同运用。

 

10. 枚举类型完结了Java.lang.comparable,并且compareTo() method会依它们呈现在enum声明里的次序来排序枚举值。

 

11. 枚举类型包括了可行的toString() method,他会回来枚举值的称号。例如,WeekDay.SUN.toString()在默许状况下会回来“SUN”字符串,此method并没有被界说为final,enum类型能够依挑选供给custom implementation。

 

12. 枚举类型供给了一个静态valueOf(),它与默许的toString()相反。把一个字符串变成一个枚举目标:static valueOf() Method。

 

13. ordinal():取得这个枚举类的index(从0开端的)。

 

14. 静态的values() method,回来一个包括完好元素的数组。

 

15. 枚举类型是java.lang.Enum的子类,他是在java5.0呈现的(Enum 自身并不是枚举类型)。你不能以手动方法扩展Enum类以发生枚举类型,假如企图这样做,那么会发生变异过错。界说枚举类型的仅有方法就是运用enum关键字。

 

16. 要扩展枚举类型是不或许的。枚举类型实际上是final,但final关键字在它们的声明里是不必要且不被答应的!由于enum实际上是final,所以它不会是abstract。

 

17. 和类相同,枚举类型能够完结接口。

 

 

在5.0今后,switch句子除了支撑byte、short、int和char外,还支撑enum(枚举)。

假如switch表达式被判定为null,会抛出空指针反常(NullPointException)。运用null作为case的值是不合法的!能够try!并且在switch中运用枚举,一般要将default:子句包括进来,否则编译器会发生-Xlint正告信息,好让你知道你没有编写程序代码来处理枚举类型一切的或许值,即便你的每一个枚举都写了一个case时,也要将defaul:子句加进来,这能够处理在你的switch句子编译完结之后,有新的值被参加枚举类型的状况。

所以,在switch中运用枚举时,都要记住加default:子句。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    第八章 装修形式环球

    形式,组件,结构
  • 2

    CreateThread()、mingxing

    线程,函数,运转
  • 3

    js 目标过错itjob

    目标,网站,上线
  • 4
  • 5
  • 6

    dom4j比如alibaba

    节点,特点,示例
  • 7

    没事瞎玩一下dongfang

    蒲公英,程序,代码
  • 8
  • 9
  • 10