本文共 3480 字,大约阅读时间需要 11 分钟。
枚举(Enum)是一种在Java中定义常量的强类型,允许代码中使用这些常量来表示一系列有限的、互不相同的值。通过 enum
关键字,我们可以创建一个自定义的枚举类型,这样在代码中引用这些常量就不再是 String
或其他任意类型,而是具体的枚举类型。
package test;enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;}public class Test { public static void main(String[] args) { Day day = Day.MONDAY; System.out.println(day.ordinal()); // 输出0 }}
编译器会将枚举类型 Day
生成一个继承自 java.lang.Enum
的类,因此,你可以使用 ordinal()
方法获取枚举常量的序数。
每个枚举常量都有 name()
和 toString()
方法,调用这些方法会返回该常量的文本表示。例如:
Day.MONDAY.name(); // 返回"MONDAY"Day.MONDAY.toString(); // 返回"MONDAY"
枚举类型在实际开发中有很多用途,比如在 switch
语句中使用:
public class Test { public enum Color { RED, BLUE, GREEN } Color color = Color.RED; public void change() { switch (color) { case RED: color = Color.BLUE; break; case BLUE: color = Color.GREEN; break; case GREEN: color = Color.RED; break; } }}
如果你想为枚举常量添加额外功能,可以在 enum
常量的定义后面添加逻辑。例如:
public enum Color { RED("红色", 1), BLUE("蓝色", 2), GREEN("绿色", 3); private String name; private int index; private Color(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null; } @Override public String toString() { return super.toString(); }}
你可以通过 ordinal()
或 name()
方法访问枚举的序号和名称,还可以通过 compareTo()
方法比较两个枚举值的顺序。
由于 Enum
类本身已继承自 java.lang.Enum
,所以我们可以让枚举类型实现接口。例如:
interface Behaviour { void print();}public enum Color implements Behaviour { RED("红色", 1), BLUE("蓝色", 2), GREEN("绿色", 3); private String name; private int index; private Color(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } @Override public void print() { System.out.print(index + ":" + name); }}public class Test { public static void main(String[] args) { Color.BLUE.print(); // 输出"2:蓝色" }}
有时候,我们可能会把枚举类型定义在接口中,这样可以让所有实现该接口的类都共享相同的枚举值。例如:
interface Thing { enum Mobile implements Thing { SamSung("三星"), Apple("6"); private String type; private Mobile(String type) { this.type = type; } public String getType() { return type; } }}public class Test implements Thing { public static void main(String[] args) { System.out.println(Mobile.SamSung.getType()); }}
为了更高效地工作sWith枚举值,可以使用 java.util.EnumSet
和 java.util.EnumMap
这些辅助类。EnumSet
可以确保集合中仅包含枚举值,而 EnumMap
则可以使用枚举类型作为键。
例如:
import java.util.EnumSet;import java.util.EnumMap;public class Test { public enum Direction { LEFT, RIGHT, UP, DOWN } public static void main(String[] args) { EnumSetdirections = EnumSet.of(Direction.LEFT, Direction.RIGHT); System.out.println(directions); // 输出{LEFT, RIGHT} EnumMap map = new EnumMap (); map.put(Direction.LEFT, "左"); map.put(Direction.RIGHT, "右"); System.out.println(map.get Direction.LEFT); // 输出"左" }}
转载地址:http://widlz.baihongyu.com/