枚举是一种标准它标准了参数的模式,这样就能够不必思考类型的不匹配并且显式的代替了 int 型参数可能带来的含糊概念 枚举像一个类,又像一个数组。
Enum 作为 Sun 全新引进的一个关键字,看起来很象是非凡的 class, 它也能够有本人的变量,能够定义本人的办法,能够实现一个或者多个接口。当咱们在申明一个 enum 类型时,咱们应该留神到 enum 类型有如下的一些特色。
1.它不能有 public 的构造函数,这样做能够保障客户代码没有方法新建一个 enum 的实例。
2.所有枚举值都是 public , static , final 的。留神这一点只是针对于枚举值,咱们能够和在一般类外面定义 变量一样定义其它任何类型的非枚举变量,这些变量能够用任何你想用的修饰符。
3.Enum 默认实现了 java.lang.Comparable 接口。
4.Enum 覆载了了 toString 办法,因而咱们如果调用 Color.Blue.toString() 默认返回字符串”Blue”.
5.Enum 提供了一个 valueOf 办法,这个办法和 toString 办法是绝对应的。调用 valueOf(“Blue”) 将返回 Color.Blue. 因而咱们在本人重写 toString 办法的时候就要留神到这一点,一把来说应该绝对应地重写 valueOf 办法。
6.Enum 还提供了 values 办法,这个办法使你可能不便的遍历所有的枚举值。
7.Enum 还有一个 oridinal 的办法,这个办法返回枚举值在枚举类种的程序,这个程序依据枚举值申明的程序而定,这里 Color.Red.ordinal() 返回 0。
用法一:常量
在 JDK1.5 之前,咱们定义常量都是:publicstaticfianl….。当初好了,有了枚举,能够把相干的常量分组到一个枚举类型里,而且枚举提供了比常量更多的办法。
Java 代码
- public enum Color {
- RED, GREEN, BLANK, YELLOW
- }
用法二:switch
JDK1.6 之前的 switch 语句只反对 int,char,enum 类型,应用枚举,能让咱们的代码可读性更强。
Java 代码
- enum Signal {
- GREEN, YELLOW, RED
- }
- public class TrafficLight {
- Signal color = Signal.RED;
- public void change() {
- switch (color) {
- case RED:
- color = Signal.GREEN;
- break;
- case YELLOW:
- color = Signal.RED;
- break;
- case GREEN:
- color = Signal.YELLOW;
- break;
- }
- }
- }
用法三:向枚举中增加新办法
如果打算自定义本人的办法,那么必须在 enum 实例序列的最初增加一个分号。而且 Java 要求必须先定义 enum 实例。
Java 代码
- public enum Color {
- RED(“ 红色 ”, 1), GREEN(“ 绿色 ”, 2), BLANK(“ 红色 ”, 3), YELLO(“ 黄色 ”, 4);
- // 成员变量
- private String name;
- private int index;
- // 构造方法
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
- // 一般办法
- public static String getName(int index) {
- for (Color c : Color.values()) {
- if (c.getIndex() == index) {
- return c.name;
- }
- }
- return null;
- }
- // get set 办法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getIndex() {
- return index;
- }
- public void setIndex(int index) {
- this.index = index;
- }
- }
用法四:笼罩枚举的办法
上面给出一个 toString() 办法笼罩的例子。
Java 代码
- public enum Color {
- RED(“ 红色 ”, 1), GREEN(“ 绿色 ”, 2), BLANK(“ 红色 ”, 3), YELLO(“ 黄色 ”, 4);
- // 成员变量
- private String name;
- private int index;
- // 构造方法
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
- // 笼罩办法
- @Override
- public String toString() {
- return this.index+”_”+this.name;
- }
- }
用法五:实现接口
所有的枚举都继承自 java.lang.Enum 类。因为 Java 不反对多继承,所以枚举对象不能再继承其余类。
Java 代码
- public interface Behaviour {
- void print();
- String getInfo();
- }
- public enum Color implements Behaviour{
- RED(“ 红色 ”, 1), GREEN(“ 绿色 ”, 2), BLANK(“ 红色 ”, 3), YELLO(“ 黄色 ”, 4);
- // 成员变量
- private String name;
- private int index;
- // 构造方法
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
- // 接口办法
- @Override
- public String getInfo() {
- return this.name;
- }
- // 接口办法
- @Override
- public void print() {
- System.out.println(this.index+”:”+this.name);
- }
- }
用法六:应用接口组织枚举
Java 代码
- public interface Food {
- enum Coffee implements Food{
- BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
- }
- enum Dessert implements Food{
- FRUIT, CAKE, GELATO
- }
- }
用法七:对于枚举汇合的应用
java.util.EnumSet 和 java.util.EnumMap 是两个枚举汇合。EnumSet 保障汇合中的元素不反复;EnumMap 中的 key 是 enum 类型,而 value 则能够是任意类型。对于这个两个汇合的应用就不在这里赘述,能够参考 JDK 文档。
对于枚举的实现细节和原理请参考:
参考资料:《ThinkingInJava》第四版
本文来源于:宋文超 super,专属平台有 csdn、思否 (SegmentFault)、简书、开源中国 (oschina),转载请注明出处。