在Java中,枚举类主要有以下几种写法:
基本枚举类
这是最简单的枚举类写法,用于定义一组固定的常量。
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
带构造方法和属性的枚举类
可以为枚举常量添加属性,并通过构造方法初始化这些属性。
public enum Day {
MONDAY("工作日"), TUESDAY("工作日"), WEDNESDAY("工作日"),
THURSDAY("工作日"), FRIDAY("工作日"), SATURDAY("周末"), SUNDAY("周末");
private String description;
Day(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
带构造方法和属性的枚举类之二(key-value类型)
- 在Java中,设计一个包含key和value的枚举类可以通过以下步骤实现:
- 定义枚举类:使用
enum
关键字定义枚举类,并在其中声明枚举常量。 - 添加属性:在枚举类中定义key和value属性,通常使用
private final
修饰,以确保其不可变。 - 构造方法:提供一个私有构造方法,用于在创建枚举常量时初始化key和value属性。
- 访问方法:提供公共的getter方法,用于获取枚举常量的key和value。
- 可选:添加静态方法:如果需要,可以添加静态方法,如根据key获取枚举常量或根据value获取枚举常量。
- 以下是一个示例代码,展示了如何设计一个key、value类型的枚举类:
public enum MyEnum {
// 枚举常量
ENUM_1("key1", "value1"),
ENUM_2("key2", "value2"),
ENUM_3("key3", "value3");
// 属性
private final String key;
private final String value;
// 构造方法
MyEnum(String key, String value) {
this.key = key;
this.value = value;
}
// getter方法
public String getKey() {
return key;
}
public String getValue() {
return value;
}
// 可选:根据key获取枚举常量
public static MyEnum fromKey(String key) {
for (MyEnum myEnum : MyEnum.values()) {
if (myEnum.getKey().equals(key)) {
return myEnum;
}
}
return null;
}
// 可选:根据value获取枚举常量
public static MyEnum fromValue(String value) {
for (MyEnum myEnum : MyEnum.values()) {
if (myEnum.getValue().equals(value)) {
return myEnum;
}
}
return null;
}
}
在上述代码中,MyEnum
枚举类包含了三个枚举常量,每个常量都有一个对应的key和value。通过提供的getter方法,可以获取枚举常量的key和value。此外,还提供了两个静态方法fromKey
和fromValue
,用于根据key或value查找对应的枚举常量。
- 使用示例:
public class Main {
public static void main(String[] args) {
// 获取枚举常量的key和value
MyEnum myEnum = MyEnum.ENUM_1;
String key = myEnum.getKey();
String value = myEnum.getValue();
System.out.println("Key: " + key + ", Value: " + value);
// 根据key获取枚举常量
MyEnum myEnumFromKey = MyEnum.fromKey("key2");
if (myEnumFromKey!= null) {
System.out.println("Found MyEnum by key: " + myEnumFromKey);
} else {
System.out.println("MyEnum not found by key");
}
// 根据value获取枚举常量
MyEnum myEnumFromValue = MyEnum.fromValue("value3");
if (myEnumFromValue!= null) {
System.out.println("Found MyEnum by value: " + myEnumFromValue);
} else {
System.out.println("MyEnum not found by value");
}
}
}
在Main
类中,首先获取了MyEnum.ENUM_1
的key和value,并打印出来。然后,使用fromKey
方法根据key查找枚举常量,并使用fromValue
方法根据value查找枚举常量。如果找到,则打印对应的枚举常量;如果未找到,则打印相应的提示信息。
请注意,上述代码中的fromKey
和fromValue
方法是通过遍历所有枚举常量来查找匹配的key或value,这在枚举常量数量较少时是可行的。如果枚举常量数量较多,可以考虑使用Map
来优化查找性能,将key或value作为键,枚举常量作为值,存储在Map
中,从而实现快速的查找操作。
实现接口的枚举类
枚举类可以实现接口,并在每个枚举常量中定义不同的行为。
public enum PaymentMethod implements Printable {
CREDIT_CARD {
@Override
public void print() {
System.out.println("用信用卡支付");
}
},
PAYPAL {
@Override
public void print() {
System.out.println("用PayPal支付");
}
};
@Override
public abstract void print();
}
抽象方法的枚举类
枚举类可以包含抽象方法,每个枚举常量需要实现该抽象方法。
public enum Operation {
PLUS {
@Override
public int apply(int a, int b) {
return a + b;
}
},
MINUS {
@Override
public int apply(int a, int b) {
return a - b;
}
};
public abstract int apply(int a, int b);
}
使用枚举的高级方法
枚举类可以使用一些高级方法,如values()
、valueOf(String name)
、ordinal()
等。
public class EnumExample {
public static void main(String[] args) {
// 使用 values() 遍历枚举
for (Day day : Day.values()) {
System.out.println(day + " - " + day.getDescription());
}
// 使用 valueOf() 获取枚举常量
Day today = Day.valueOf("FRIDAY");
System.out.println("Today is " + today);
// 使用 ordinal() 获取枚举的索引
int index = today.ordinal();
System.out.println("Today's index is " + index);
}
}
这些写法可以根据不同的需求选择使用,使得枚举类更加灵活和强大。