在Java中,enum
(枚举)是一个特殊的类,用于表示一组常量。enum
类型在Java中提供了一种类型安全的方式来定义常量,相比传统的常量(如public static final
变量),它更加简洁、类型安全,并且可以包含字段、方法和构造函数。枚举类型继承自java.lang.Enum
类,因此它们具有一些内置的方法,例如values()
和valueOf()
。
1. 枚举的基本定义
枚举用于定义一组常量。你可以通过enum
关键字来定义一个枚举类型。每个枚举常量可以作为该枚举类型的一个实例。
java">public enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
在这个例子中,Day
枚举包含了一周的七天常量。每个常量都隐式是Day
类型的一个实例。
2. 枚举的基本使用
枚举常量可以直接使用,枚举类型还提供了values()
方法,它返回一个包含所有枚举常量的数组。
java">public class EnumExample {public static void main(String[] args) {Day day = Day.MONDAY;// 使用枚举常量switch (day) {case MONDAY:System.out.println("Start of the work week!");break;case SUNDAY:System.out.println("It's the weekend!");break;default:System.out.println("Mid-week");break;}// 输出所有枚举常量for (Day d : Day.values()) {System.out.println(d);}// 使用 valueOf 方法Day dayFromString = Day.valueOf("MONDAY");System.out.println("Day from String: " + dayFromString);}
}
输出:
Start of the work week!
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
Day from String: MONDAY
3. 枚举可以有字段和方法
枚举不仅仅包含常量,还可以包含字段和方法。比如,你可以为每个枚举常量添加一些与之相关的数据,或者定义一些方法来处理这些数据。
java">public enum Direction {NORTH(0), EAST(90), SOUTH(180), WEST(270);private final int degree;// 构造函数Direction(int degree) {this.degree = degree;}public int getDegree() {return degree;}
}public class EnumWithMethods {public static void main(String[] args) {// 输出方向和它们的角度for (Direction direction : Direction.values()) {System.out.println(direction + " has degree: " + direction.getDegree());}}
}
输出:
NORTH has degree: 0
EAST has degree: 90
SOUTH has degree: 180
WEST has degree: 270
4. 枚举的常用方法
values()
方法
values()
方法返回包含所有枚举常量的数组。你可以用它来遍历所有的枚举常量。
java">for (Day day : Day.values()) {System.out.println(day);
}
valueOf(String name)
方法
valueOf()
方法将字符串转换为对应的枚举常量。如果传入的字符串与枚举常量名称不匹配,会抛出IllegalArgumentException
。
java">Day day = Day.valueOf("MONDAY");
System.out.println(day); // 输出 MONDAY
ordinal()
方法
ordinal()
方法返回枚举常量的序号(从0开始)。它表示枚举常量在声明时的顺序。
java">System.out.println(Day.MONDAY.ordinal()); // 输出 1
5. 枚举的构造函数
枚举常量可以有构造函数,你可以在构造函数中初始化枚举常量的字段。每个枚举常量都调用该构造函数进行初始化。
java">public enum Planet {MERCURY(3.303e+23, 2.4397e6), // 第一个常量VENUS(4.867e+24, 6.0518e6), // 第二个常量EARTH(5.976e+24, 6.3781e6); // 第三个常量private final double mass; // 质量private final double radius; // 半径// 构造函数Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}public double getMass() {return mass;}public double getRadius() {return radius;}public double surfaceGravity() {final double G = 6.67300E-11; // 引力常数return G * mass / (radius * radius);}public static void main(String[] args) {for (Planet p : Planet.values()) {System.out.printf("%s: mass = %.2e, radius = %.2e, gravity = %.2f%n",p, p.getMass(), p.getRadius(), p.surfaceGravity());}}
}
输出:
MERCURY: mass = 3.30e+23, radius = 2.44e+06, gravity = 3.70
VENUS: mass = 4.87e+24, radius = 6.05e+06, gravity = 8.87
EARTH: mass = 5.98e+24, radius = 6.38e+06, gravity = 9.81
6. 枚举与switch
语句
你可以使用switch
语句来基于枚举常量执行不同的代码块。由于枚举类型是类型安全的,switch
语句可以确保只有枚举类型的常量才能用于比较。
java">public class EnumSwitchExample {public static void main(String[] args) {Day day = Day.WEDNESDAY;// 使用switch语句判断当天是周几switch (day) {case MONDAY:System.out.println("Start of the week!");break;case WEDNESDAY:System.out.println("Midweek!");break;case FRIDAY:System.out.println("Almost weekend!");break;default:System.out.println("Weekday!");}}
}
输出:
Midweek!
总结
- 定义枚举类型:使用
enum
关键字可以定义枚举类型,表示固定的一组常量。 - 字段和方法:枚举类型可以有字段和方法,用来处理与枚举常量相关的逻辑。
- 内置方法:
values()
方法返回所有枚举常量,valueOf()
方法根据名称返回对应常量,ordinal()
返回常量的序号。 - 类型安全:枚举提供了一种类型安全的方式来处理常量,避免了传统常量方式可能导致的错误。
通过枚举,你可以在Java中轻松地表示一组常量,并且可以附加更多的逻辑,极大地增强了代码的可读性和可维护性。