java中枚举
2017-09-05 10:05
197 查看
在2005年之后增加了枚举,它的功能与多例设计模式基本上一样。在JAVA中用enum来定义一个类,相当于这个类继承了Enum类,Enum这个的构造方法是私有的,定义如下:
如何证明这个是Enum类的继承:
在上面的代码中,我们可以调用不是在Color中定义的方法ordinal()与name()的方法,说明用它们具有继承关系。
在多例设计模式中我们可以在类中定义方法与方法等,枚举也可以,但是有要求:
1 枚举中的定义的构造方法不能够使用public声明:
2 枚举对象必须放在道行,随后才可以定义属性、构造方法、普通方法。
扩充枚举:
此时与多例设计模式操作方式完全相同,而且更加简单。
枚举实现接口:因为它可以看作是一个类,所以它可以像变通类那样来实现接口,这里不多介;我们现在在每一个对象后面使用匿名内部类的形式来实现接口:
枚举中定义抽象方法:
它的实现与使用匿名内部类的形式来实现接口差不多,还是每个单独实现。
protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; }
如何证明这个是Enum类的继承:
enum Color { RED,GREEN,BLUE; } public class EnumTest { public static void main(String[] args) { for(Color color : Color.values()){ //ordinal()取得下标 System.out.println(color.ordinal() + " " + color.name()); } } }
在上面的代码中,我们可以调用不是在Color中定义的方法ordinal()与name()的方法,说明用它们具有继承关系。
在多例设计模式中我们可以在类中定义方法与方法等,枚举也可以,但是有要求:
1 枚举中的定义的构造方法不能够使用public声明:
2 枚举对象必须放在道行,随后才可以定义属性、构造方法、普通方法。
扩充枚举:
package com.test; enum Color { //枚举对象必须定义在道行,自动调用对应的构造方法来初始化 RED("红色") , GREEN , BLUE("蓝色") ; private String title ; //属性 private Color() { } private Color(String title){ //不能使用public来定义构造方法 this.title = title ; } public String toString(){ return this.title ; } }
此时与多例设计模式操作方式完全相同,而且更加简单。
枚举实现接口:因为它可以看作是一个类,所以它可以像变通类那样来实现接口,这里不多介;我们现在在每一个对象后面使用匿名内部类的形式来实现接口:
package com.test; interface Message { public String getTitle(); } enum Color implements Message { // 枚举对象必须定义在道行,自动调用对应的构造方法来初始化 RED("红色") { public String getTitle() { return this.toString(); //不能直接写this,因为this是一个对象, } }, GREEN { public String getTitle() { return this.toString(); } }, BLUE("蓝色") { public String getTitle() { return this.toString(); } }; private String title; // 属性 private Color() { } private Color(String title) { // 不能使用public来定义构造方法 this.title = title; } public String toString() { return this.title; } }
枚举中定义抽象方法:
package com.test; enum Color{ // 枚举对象必须定义在道行,自动调用对应的构造方法来初始化 RED("红色") { public String getTitle() { return this.toString(); //不能直接写this,因为this是一个对象, } }, GREEN { public String getTitle() { return "" + this; } }, BLUE("蓝色") { public String getTitle() { return "" + this; } }; private String title; // 属性 private Color() { } private Color(String title) { // 不能使用public来定义构造方法 this.title = title; } public String toString() { return this.title; } //定义抽象方法 public abstract String getTitle(); }
它的实现与使用匿名内部类的形式来实现接口差不多,还是每个单独实现。