SCJP认证 1.5.5 声明枚举(1)

从5.0版本开始,Java允许限制一个变量只能具有几个预定义的值中的某个值——换句话说,是来自于枚举列表中的一个值(枚举列表中的奇怪项背奇怪地成为“枚举”——enum)

利用枚举有助于减少代码中的bug。

例如,在咖啡店应用程序中,你可能想将规格选择限制为BIG,HUGE和OVERWHELMING,如果允许订购LARGE或GRANDE规格的,则可能引发错误。这是枚举就可以提供帮助。通过下面简单的声明,就可以保证编译器就会阻止将除BIG,HUGE和OVERWHELMING之外的任何内容赋予CoffeeSize

enum CoffeeSize{BIG,HUGE, OVERWHELMING}

从此,获得CoffeeSize的唯一方式是使用像下面这样的语句:

CoffeeSize cs =CoffeeSize.BIG;

将枚举常量全部大写并不是必须的,但根据Sun的编码规范,常量要大写,这是一个好的做法。

枚举的基本成分是其常量(即BIG、HUGE和OVERWHELMING),尽管一分钟后你将看到枚举还包含更多内容。枚举可以被声明为他们自己独立的类,或者被声明为i类成员,但是不能在方法内声明它们!

在类外声明枚举如下所示:

enum CoffeeSize{BIG, HUGE, OVERWHELMING} class Coffee{ CoffeeSize size; } public class CoffeeTest1{ public static void main(String[] args){ Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG; //enum outside class } }

 上面的代码可以是单一的文件的一部分(记住,该文件必须被命名为CoffeeTest.java,因为这是该文件中的公共类的名称)。要记住的要点是:可以只用public或默认修饰符声明类外的美剧,就像飞内部类一样。下面是在类内声明枚举的一个例子:

class Coffee2{ enum CoffeeSize {BIG, HUGE,OVERWHELMING} CoffeeSize size; } public class CoffeeTest2{ public static void main(String[] args){ Coffee2 drink = new Coffee2(); drink.size = Coffee2.CoffeeSize.BIG;// enclosing class, // name required } }

通过这些例子呀一重点理解的是:枚举可以在自己的类内声明,也可以位于另一个类中,而访问枚举成员的语法依赖于声明枚举的位置。

下面的代码是非法的:

public class CoffeeTest1{ public static void main(String[] args){ enum CoffeeSize{BIG, HUGE, OVERWHELMING}// WRONG!Can not // declare enums // in methods Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG; } }

 Java语言设计者允许选择在枚举声明的末尾位置放置一个分号(在这个枚举声明没有其他声明的情况下),着和容易是人困惑:

public class CoffeeTest1 { enum CoffeeSize {BIG, HUGE, OVERWHELMING } public static void main(String[] args){ Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG; } }

那么,在创建枚举时会得到什么呢?要记住的最重要的事情是:枚举不是字符串或整数!每个枚举的CoffeeSize类型实际上都是CoffeeSize的实例。换句话说,BIG是CoffeeSize类型的。可以将枚举看做类的一种,形式如下(但不完全这样) :

 class CoffeeSize { public static final CoffeeSize BIG = new CoffeeSize("BIG",0); public static final CoffeeSize HUGE = new CoffeeSize("HUGE", 1); public static final CoffeeSize OVERWHELMING = new CoffeeSize("OVERWHELMING", 2); public CoffeeSize(String enumName, int index){ // stuff here } public static void main(String[] args){ System.out.println(CoffeeSize.BIG); } }

注意每个枚举值BIG、HUGE和OVERWHELIMING是如何成为类型CoffeeSize的实例的。它们被表示为static和final,在Java世界中,这被当做常量。还要注意,每个枚举值都知道它的索引或位置。换句话说,枚举值中的顺序是生民事决定的。可以将CoffeeSize枚举看做存在于CoffeeSize类型的数组中。在后面的一张中将看到,可以通过为任何枚举类型调用values()方法来遍历枚举的值(本章中不必关心这一点)

 

你可能感兴趣的:(SCJP认证 1.5.5 声明枚举(1))