1. 枚举(Enum)简介
什么是枚举?
枚举(Enum)是Java中的一种特殊数据类型,用于定义一组固定的常量。枚举类型可以增强代码的可读性和安全性,避免使用魔法数字或字符串。
枚举的特点
- 类型安全:枚举常量是类型安全的,不能随意赋值。
- 代码简洁:枚举常量可以直接使用,无需定义多个常量。
- 可扩展性:枚举可以包含方法、字段和构造函数。
2. 枚举的定义
基本语法
enum 枚举名 {
常量1, 常量2, 常量3;
}
示例
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
3. 枚举的使用
示例1:基本使用
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public class Main {
public static void main(String[] args) {
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
System.out.println("Today is Monday.");
break;
case TUESDAY:
System.out.println("Today is Tuesday.");
break;
default:
System.out.println("It's another day.");
}
}
}
输出:
Today is Monday.
示例2:枚举与字段、方法
枚举可以包含字段和方法,每个枚举常量可以有自己的行为。
enum Day {
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
private String chineseName;
// 构造函数
Day(String chineseName) {
this.chineseName = chineseName;
}
// 方法
public String getChineseName() {
return chineseName;
}
}
public class Main {
public static void main(String[] args) {
Day today = Day.MONDAY;
System.out.println("Today is " + today.getChineseName());
}
}
输出:
Today is 星期一
示例3:枚举实现接口
枚举可以实现接口,为每个枚举常量提供不同的行为。
interface Greeting {
void greet();
}
enum Day implements Greeting {
MONDAY {
public void greet() {
System.out.println("周一加油!");
}
},
TUESDAY {
public void greet() {
System.out.println("周二继续努力!");
}
};
// 必须实现接口方法
public abstract void greet();
}
public class Main {
public static void main(String[] args) {
Day today = Day.MONDAY;
today.greet();
}
}
输出:
周一加油!
4. 枚举的注意事项
1. 枚举是单例的
每个枚举常量在JVM中都是单例的,枚举类型的构造函数是私有的,不能通过new
关键字创建实例。
2. 枚举可以用于switch
语句
枚举类型可以与switch
语句结合使用,增强代码的可读性。
3. 枚举可以实现接口
枚举可以实现接口,为每个枚举常量提供不同的行为。
4. 枚举可以包含字段和方法
枚举可以像普通类一样包含字段和方法,甚至可以定义抽象方法,让每个枚举常量实现。
5. 枚举的比较
枚举常量可以使用==
进行比较,因为枚举常量是单例的。
Day today = Day.MONDAY;
if (today == Day.MONDAY) {
System.out.println("今天是周一!");
}
6. 枚举的序列化
枚举的序列化是安全的,Java保证了枚举常量的唯一性。
7. 枚举的性能
枚举的性能略低于常量,因为枚举是类,而常量是基本类型或字符串。
5. 枚举的常见使用场景
1. 状态机
枚举可以用于表示有限的状态,例如订单状态、任务状态等。
enum OrderStatus {
PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED;
}
2. 配置选项
枚举可以用于表示配置选项,例如日志级别、颜色等。
enum LogLevel {
DEBUG, INFO, WARN, ERROR;
}
3. 单例模式
枚举可以用于实现单例模式,确保线程安全。
enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("Doing something...");
}
}
public class Main {
public static void main(String[] args) {
Singleton.INSTANCE.doSomething();
}
}
6. 枚举的高级用法
枚举与泛型
枚举可以与泛型结合使用,增强灵活性。
enum Operation {
ADD {
public <T> T apply(T x, T y) {
if (x instanceof Integer) {
return (T) (Integer) ((Integer) x + (Integer) y);
}
throw new UnsupportedOperationException();
}
},
SUBTRACT {
public <T> T apply(T x, T y) {
if (x instanceof Integer) {
return (T) (Integer) ((Integer) x - (Integer) y);
}
throw new UnsupportedOperationException();
}
};
public abstract <T> T apply(T x, T y);
}
public class Main {
public static void main(String[] args) {
System.out.println(Operation.ADD.apply(10, 5)); // 输出:15
System.out.println(Operation.SUBTRACT.apply(10, 5)); // 输出:5
}
}
7. 总结
特性 | 描述 |
---|---|
定义 | 使用enum 关键字定义枚举类型。 |
字段与方法 | 枚举可以包含字段、方法和构造函数。 |
实现接口 | 枚举可以实现接口,为每个枚举常量提供不同的行为。 |
单例性 | 每个枚举常量在JVM中都是单例的。 |
switch语句 | 枚举可以与switch 语句结合使用。 |
常见场景 | 状态机、配置选项、单例模式等。 |
注意事项 | 枚举是单例的,不能通过new 创建实例;枚举的性能略低于常量。 |
文章作者:zhexian
文章标题:java基础教程–枚举
文章链接:https://zhexiange.com/jsbj/23.html
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自zhexian !
文章标题:java基础教程–枚举
文章链接:https://zhexiange.com/jsbj/23.html
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自zhexian !
手机扫码阅读