Java 枚举
本文最后更新于:2024年3月18日 凌晨
Java 枚举
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号,
来分割。
例如定义一个颜色的枚举类。
1 2 3 4 5 enum Color { RED, GREEN, BLUE; }
以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。
使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 enum Color { RED, GREEN, BLUE; }public class Test { public static void main (String[] args) { Color c1 = Color.RED; System.out.println(c1); } }
enum类型
Java使用enum
定义枚举类型,它被编译器编译为final class Xxx extends Enum {…}
,定义的enum
类型总是继承自java.lang.Enum
,且无法被继承。
只能定义出enum
的实例,而无法通过new
操作符创建enum
的实例,定义的每个实例都是引用类型的唯一实例。
例如,我们定义的Color
枚举类:
1 2 3 4 5 public enum Color { RED, GREEN, BLUE; }
1 2 3 4 5 6 7 8 public final class Color extends Enum { public static final Color RED = new Color(); public static final Color GREEN = new Color(); public static final Color BLUE = new Color(); private Color () {} }
所以,编译后的enum
类和普通class
并没有任何区别,但是我们自己无法按定义普通class
那样来定义enum
,必须使用enum
关键字,这是Java语法规定的。
迭代枚举元素
1 2 3 4 5 6 7 8 9 10 11 12 13 enum Color { RED, GREEN, BLUE; }public class MyClass { public static void main (String[] args) { for (Color myVar : Color.values()) { System.out.println(myVar); } } }
在 switch 中使用枚举类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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 ; } } }
values(), ordinal()和 valueOf()方法
enum 定义的枚举类默认继承了 java.lang.Enum
类,并实现了 java.lang.Seriablizable
和 java.lang.Comparable
两个接口。
values()
, ordinal()
和 valueOf()
方法位于 java.lang.Enum
类中:
values()
返回枚举类中所有的值。
name()
获取常量定义的字符串,注意不要使用toString()
ordinal()
方法可以找到每个枚举常量的索引,就像数组索引一样。
valueOf()
方法返回指定字符串值的枚举常量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 enum Color { RED, GREEN, BLUE; }public class Test { public static void main (String[] args) { Color[] arr = Color.values(); for (Color col : arr) { System.out.println(col + " at index " + col.ordinal()); } System.out.println(Color.valueOf("RED" )); } }
1 2 3 4 RED at index 0 GREEN at index 1 BLUE at index 2 RED
枚举类成员
枚举跟普通类一样可以用自己的变量,方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
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 @ToString @AllArgsConstructor @Getter public enum UserStatusEnum { NORMAL("NORMAL" , "正常" ), PROHIBIT("PROHIBIT" , "禁用" ); private final String code; private final String comment; public static UserStatusEnum parse (String code) { for (UserStatusEnum item : UserStatusEnum.values()) { if (ObjectUtil.equals(item.code, code)) { return item; } } return null ; } }
枚举既可以包含具体方法,也可以包含抽象方法,如果枚举类具有抽象方法 ,则枚举类的每个实例都必须实现它。
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 enum Color { RED{ public String getColor () { return "红色" ; } }, GREEN{ public String getColor () { return "绿色" ; } }, BLUE{ public String getColor () { return "蓝色" ; } }; public abstract String getColor () ; }public class Test { public static void main (String[] args) { for (Color c:Color.values()){ System.out.print(c.getColor() + "," ); } } }