枚举的定义及其使用
在Java中,enum
(枚举)是一个特殊的类,用于表示一组常量。enum
类型在Java中提供了一种类型安全的方式来定义常量,相比传统的常量(如public static final
变量),它更加简洁、类型安全,并且可以包含字段、方法和构造函数。枚举类型继承自java.lang.Enum
类,因此它们具有一些内置的方法,例如values()
和valueOf()
。
1. 枚举的基本定义
枚举用于定义一组常量。你可以通过enum
关键字来定义一个枚举类型。每个枚举常量可以作为该枚举类型的一个实例。
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
在这个例子中,Day
枚举包含了一周的七天常量。每个常量都隐式是Day
类型的一个实例。
2. 枚举的基本使用
枚举常量可以直接使用,枚举类型还提供了values()
方法,它返回一个包含所有枚举常量的数组。
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. 枚举可以有字段和方法
枚举不仅仅包含常量,还可以包含字段和方法。比如,你可以为每个枚举常量添加一些与之相关的数据,或者定义一些方法来处理这些数据。
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()
方法返回包含所有枚举常量的数组。你可以用它来遍历所有的枚举常量。
for (Day day : Day.values()) {
System.out.println(day);
}
valueOf(String name)
方法
valueOf()
方法将字符串转换为对应的枚举常量。如果传入的字符串与枚举常量名称不匹配,会抛出IllegalArgumentException
。
Day day = Day.valueOf("MONDAY");
System.out.println(day); // 输出 MONDAY
ordinal()
方法
ordinal()
方法返回枚举常量的序号(从0开始)。它表示枚举常量在声明时的顺序。
System.out.println(Day.MONDAY.ordinal()); // 输出 1
5. 枚举的构造函数
枚举常量可以有构造函数,你可以在构造函数中初始化枚举常量的字段。每个枚举常量都调用该构造函数进行初始化。
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
语句可以确保只有枚举类型的常量才能用于比较。
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中轻松地表示一组常量,并且可以附加更多的逻辑,极大地增强了代码的可读性和可维护性。