Java 枚举(enum)
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
例如定义一个颜色的枚举类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| enum Color { RED, GREEN, BLUE; } public class Test { public static void main(String[] args) { Color c1 = Color.RED; System.out.println(c1); } }
|
以上枚举类 Color
颜色常量有 RED, GREEN, BLUE
,分别表示红色,绿色,蓝色。
每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的。
以上的枚举类 Color 转化在内部类实现:
1 2 3 4 5 6
| class Color { public static final Color RED = new Color(); public static final Color BLUE = new Color(); public static final Color GREEN = new Color(); }
|
values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
1. 枚举类常量
1 2 3 4 5 6 7 8 9
|
public enum ColorEnum { RED, GREEN, BLANK, YELLOW; }
|
测试类:
1 2 3 4 5 6 7 8
| @Test public void ColorTest() { for(ColorEnum color:ColorEnum.values()) { System.out.println(color+",ordinal:"+color.ordinal()+",name:"+color.name()); } }
|
2. 带一个参数的枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public enum TypeEnum { FIREWALL("firewall"), SECRET("secretMac"), BALANCE("f5"); private String typeName;
TypeEnum(String typeName) { this.typeName = typeName; }
public static TypeEnum fromTypeName(String typeName) { for (TypeEnum type : TypeEnum.values()) { if (type.getTypeName().equals(typeName)) { return type; } } return null; }
public String getTypeName() { return this.typeName; } }
|
测试类:
1 2 3 4 5 6 7 8 9
| @Test public void TypeTest() { String typeName = "f5"; TypeEnum type = TypeEnum.fromTypeName(typeName); System.out.println(type+",typeName:"+type.getTypeName()+",ordinal:"+type.ordinal()+",name:"+type.name()); }
|
3. 向枚举类中添加新方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public enum SeasonEunm { SPRING("春","春困"),SUMMER("夏","夏睡"),AUTUMN("秋","秋乏"),WINTER("冬","冬眠");
private SeasonEunm(String name, String value) { this.name = name; this.value = value; }
private String name; private String value;
public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
|
测试类:
1 2 3 4 5 6 7 8
| @Test public void SessionTest() { for(SeasonEunm seasion:SeasonEunm.values()) { System.out.println(seasion+",ordinal:"+seasion.ordinal()+",name:"+seasion.name()); System.out.println("枚举变量值:"+seasion.getName()+",枚举变量值:"+seasion.getValue()); } }
|
4. 覆盖枚举的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public enum RGBEnum { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); private String name; private int index; private RGBEnum(String name, int index) { this.name = name; this.index = index; }
@Override public String toString() { return this.index+"_"+this.name; } }
|
测试类:
1 2 3 4 5 6 7
| @Test public void RGBEnumTest() { for(RGBEnum rgb:RGBEnum.values()) { System.out.println(rgb.toString()); } }
|
5. 在 switch 中使用枚举类
枚举类常应用于 switch 语句中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| enum Color { RED, GREEN, BLUE; } public class MyClass { public static void main(String[] args) { Color myVar = Color.BLUE;
switch(myVar) { case RED: System.out.println("红色"); break; case GREEN: System.out.println("绿色"); break; case BLUE: System.out.println("蓝色"); break; } } }
|