谪仙阁-记录美好瞬间

java基础教程–枚举

作者头像
谪仙 本文作者

2025-3-14 阅读 70 约 9分钟读完

评论0

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创建实例;枚举的性能略低于常量。


手机扫码阅读
上一篇 java基础教程–接口 下一篇 Java面向对象编程基础教程
评论