enum关键字,即枚举,是Java SE5添加的看似很小的特性,实际上特别的好用。
枚举类型是由关键字enum修饰的, 将一组常量的有限集合创建为新的数据类型。
T[] valuese()
返回枚举常量数组
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static > T valueOf(Class enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
如果不存在给定名字的示例,将会抛出异常IllegalArgumentException
示例代码:
public class TextEnum {
public static void main(String[] args) {
Enum colorRed = Color.RED;
Enum colorBlue = Color.BLUE;
Enum colorDark = Color.DARK;
// 返回枚举常量数据组
for (Color c: Color.values()) {
System.out.println("values: " + c);
}
System.out.println("color = " + colorRed );
// compareTo比较此枚举与指定对象的顺序
// A.compareTo(B)
// 若A在B的后面,返回1
// 若A在B的前面,返回-1
System.out.println("compareTo : " + colorBlue.compareTo(colorRed));
System.out.println("compareTo : " + colorBlue.compareTo(colorDark));
// getDeclaringClass:返回与此枚举常量的枚举类型相对应的 Class 对象
// 返回对象的名称包括包名
System.out.println("getDeclaringClass: " + colorBlue.getDeclaringClass());
// name:返回此枚举常量的名称,在其枚举声明中对其进行声明
System.out.println("name: " + colorBlue.name());
// ordinal:返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
System.out.println("ordinal: " + colorBlue.ordinal());
// toString:返回枚举常量的名称,它包含在声明中
System.out.println("toString: " + colorBlue.toString());
// valueOf:返回带指定名称的指定枚举类型的枚举常量
System.out.println("valueOf: " + Enum.valueOf(Color.class, "RED"));
}
}
// Log打印
values: RED
values: BLUE
values: DARK
color = RED
compareTo : 1
compareTo : -1
getDeclaringClass: class com.teaphy.observer.enum_.Color
name: BLUE
ordinal: 1
toString: BLUE
valueOf: RED
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类 (java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum
/**
* 定义常量
*/
public enum Color {
RED, BLUE, DARK
}
// 这段代码实际上调用了3次 Enum(String name, int ordinal):
new Enum("RED",0);
new Enum("BLUE",1);
new Enum("DARK",2);
枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public enum Color {
RED, BLUE, DARK
}
JDK1.6之前的switch语句只支持int,char,enum类型。JDk1.6后switch支持enum。由于switch是要在有限的可能值 集合中进行选择。enum与switch组合是绝佳的,因为enum的名字能清楚的表明程序意欲如何,提高代码的可读性。
示例代码:
public class TextEnum {
public static void main(String[] args) {
Color colorRed = Color.RED;
Color colorBlue = Color.BLUE;
Color colorDark = Color.DARK;
testSwitch(colorRed);
testSwitch(colorBlue);
testSwitch(colorDark);
}
private static void testSwitch(Color color) {
switch (color) {
case RED:
System.out.println("Switch - color = " + RED);
break;
case BLUE:
System.out.println("Switch - color = " + BLUE);
break;
case DARK:
System.out.println("Switch - color = " + DARK);
break;
default:
break;
}
}
}
}
// Log打印
Switch - color = RED
Switch - color = BLUE
Switch - color = DARK
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且,Java要求必须先定义enum实例,如果在定义enum实例之前定义了任何方法属性,那么编译时会报错。
enum的构造方法一般有意的将访问权限设置为private.其实设置其他的访问权限也可,对enum没有任何影响。因为我们只能通过enum内部构造器创建enum实例,一旦enum定义结束,JVM将不在允许使用其他构造器来创建enum实例。
示例代码:
public enum ColorWithMethod {
RED("红色", 1), GREEN("绿色", 2), WHITE("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private ColorWithMethod(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (ColorWithMethod c : ColorWithMethod.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;
}
@Override
public String toString() {
return "ColorWithMethod{" +
"name='" + name + '\'' +
", index=" + index +
'}';
}
}
// 测试类
public class TextEnum {
public static void main(String[] args) {
ColorWithMethod colorWithMethod = ColorWithMethod.WHITE;
System.out.println("getName: " + colorWithMethod.getName());
System.out.println("getIndex: " + colorWithMethod.getIndex());
System.out.println("ordinal: " + colorWithMethod.ordinal());
colorWithMethod.setName("紫色");
colorWithMethod.setIndex(10);
System.out.println("getName: " + colorWithMethod.getName());
System.out.println("getIndex: " + colorWithMethod.getIndex());
System.out.println("ordinal: " + colorWithMethod.ordinal());
}
}
// Log
getName: 白色
getIndex: 3
ordinal: 2
getName: 紫色
getIndex: 10
ordinal: 2
所有的枚举都继承自java.lang.Enum类,而Enum又继承于Object类。因为Java不支持多继承,枚举类不允许再继承其他的类,但是可以实现接口。
示例代码:
public enum ColorWithInterface implements IColor{
RED("红色", 1), GREEN("绿色", 2), WHITE("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private ColorWithInterface(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (ColorWithInterface c : ColorWithInterface.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;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
@Override
public String toString() {
return "ColorWithMethod{" +
"name='" + name + '\'' +
", index=" + index +
'}';
}
}
public class TextEnum {
public static void main(String[] args) {
//
ColorWithInterface colorInterface = ColorWithInterface.GREEN;
System.out.println("ColorWithInterface - getInfo: " + colorInterface.getInfo());
IColor iColor = ColorWithInterface.GREEN;
System.out.println("IColor - getInfo: " + colorInterface.getInfo());
}
}
// Log打印
ColorWithInterface - getInfo: 绿色
IColor - getInfo: 绿色
示例代码:
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
public class TextEnum {
public static void main(String[] args) {
//
ColorWithInterface colorInterface = ColorWithInterface.GREEN;
System.out.println("ColorWithInterface - getInfo: " + colorInterface.getInfo());
IColor iColor = ColorWithInterface.GREEN;
System.out.println("IColor - getInfo: " + colorInterface.getInfo());
}
}
// Log打印
Food: BLACK_COFFEE
Food: FRUIT
示例代码:
public enum Color {
RED, BLUE, DARK
}
public class TextEnum {
public static void main(String[] args) {
// EnumSet的使用
EnumSet colorSet = EnumSet.allOf(Color.class);
for (Color color : colorSet) {
System.out.println("EnumSet: " + color);
}
// EnumMap的使用
EnumMap colorMap = new EnumMap(Color.class);
colorMap.put(Color.RED, "红色");
colorMap.put(Color.BLUE, "红色");
colorMap.put(Color.DARK, "黑色");
for (Iterator> iter = colorMap.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = iter.next();
System.out.println("EnumMap: " + entry.getKey().name() + ":" + entry.getValue());
}
}
// Log打印
EnumSet: RED
EnumSet: BLUE
EnumSet: DARK
EnumMap: RED:红色
EnumMap: BLUE:红色
EnumMap: DARK:黑色
参考资料
1.Java编程思想
2.JAVA EMNU
3.java enum(枚举)使用详解 + 总结