JAVA枚举类

Java 枚举类(enum)具有几个独特的特性,使其在管理常量和进行状态控制时非常有用。以下是 Java 枚举类的主要特性:

1. 唯一实例

  • 枚举类中的每个枚举常量都是 public static final 类型的唯一实例。你不能直接创建新的枚举实例。每个枚举常量都表示一个固定的、不可变的对象。
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

2. 隐式继承 java.lang.Enum

  • 枚举类隐式地继承自 java.lang.Enum 类,不能再继承其他类。这个继承提供了许多内置的方法,比如 values()valueOf()name(), 和 ordinal()
Day day = Day.MONDAY;
System.out.println(day.name());   // 输出 "MONDAY"
System.out.println(day.ordinal()); // 输出 0

3. 可以包含字段、方法和构造函数

  • 枚举类可以定义字段、方法和构造函数。构造函数是私有的,因此只能在枚举内部被调用。
public enum Color {
    RED("Red Color"), GREEN("Green Color"), BLUE("Blue Color");

    private final String description;

    Color(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

4. 实现接口

  • 枚举类可以实现接口,但不能继承其他类。接口中的方法需要在枚举类中实现。
public interface Describable {
    String getDescription();
}

public enum Season implements Describable {
    WINTER("Cold Season"), SPRING("Blooming Season"), SUMMER("Hot Season"), FALL("Falling Leaves");

    private final String description;

    Season(String description) {
        this.description = description;
    }

    @Override
    public String getDescription() {
        return description;
    }
}

5. 自带 toString() 方法

  • 枚举类有自带的 toString() 方法,返回枚举常量的名字,默认实现是常量的名称。
System.out.println(Day.MONDAY.toString()); // 输出 "MONDAY"

6. 支持 switch 语句

  • 枚举类的实例可以用于 switch 语句,switch 语句的 case 标签可以是枚举常量。
switch (Day.MONDAY) {
    case MONDAY:
        System.out.println("Start of the work week.");
        break;
    case FRIDAY:
        System.out.println("End of the work week.");
        break;
    default:
        System.out.println("Midweek.");
        break;
}

7. values() 和 valueOf() 方法

  • values() 方法返回所有枚举常量的数组。valueOf(String name) 方法根据名称返回相应的枚举常量。
for (Day day : Day.values()) {
    System.out.println(day);
}

Day day = Day.valueOf("MONDAY");

8. 线程安全

  • 枚举类是线程安全的,因为它的实例在类加载时被创建并且是不可变的。

9. 与 Java 反射兼容

  • 枚举类支持反射操作,但由于枚举常量是唯一的,因此反射通常用于获取枚举常量的类型信息。
Class<?> clazz = Day.class;
for (Object enumConstant : clazz.getEnumConstants()) {
    System.out.println(enumConstant);
}

10. EnumSet 和 EnumMap 支持

  • Java 标准库提供了 EnumSet 和 EnumMap,这两种集合类是专门为枚举类型设计的,提供了高效的操作和存储方式。
EnumSet<Day> weekends = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
EnumMap<Day, String> dayMap = new EnumMap<>(Day.class);
dayMap.put(Day.MONDAY, "Start of the week");

示例代码

以下是一个包含多个特性的枚举类示例:

public enum WeekDay {
    MONDAY("First day of the week"), 
    TUESDAY("Second day of the week"),
    WEDNESDAY("Third day of the week"),
    THURSDAY("Fourth day of the week"),
    FRIDAY("Fifth day of the week"),
    SATURDAY("Weekend starts"), 
    SUNDAY("Weekend ends");

    private final String description;

    WeekDay(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public static void main(String[] args) {
        for (WeekDay day : WeekDay.values()) {
            System.out.println(day + ": " + day.getDescription());
        }
    }
}

结论

Java 枚举类不仅可以表示一组固定的常量,还能包含字段、方法、实现接口等复杂功能。这些特性使得枚举类不仅限于简单的常量集合,还可以用于更复杂的状态管理和业务逻辑实现。

枚举类的属性可以直接填充构造函数吗?

在 Java 中,枚举类的属性可以直接填充到构造函数中。这种方式允许你为每个枚举常量提供不同的属性值,并在定义枚举常量时初始化这些属性。这样做的好处是可以为每个枚举常量定义特定的行为或者状态,使枚举类更加灵活和功能丰富。

举例来说,假设有一个表示颜色的枚举类:

public enum Color {
    RED("Red Color", "#FF0000"),
    GREEN("Green Color", "#00FF00"),
    BLUE("Blue Color", "#0000FF");

    private final String description;
    private final String hexCode;

    Color(String description, String hexCode) {
        this.description = description;
        this.hexCode = hexCode;
    }

    public String getDescription() {
        return description;
    }

    public String getHexCode() {
        return hexCode;
    }
}

在这个例子中,每个枚举常量(如 REDGREENBLUE)都有自己的 description 和 hexCode 属性,并且在构造函数中进行初始化。这样定义枚举常量可以让你通过调用相应的方法(如 getDescription() 或 getHexCode())来获取每个枚举常量的属性值。

总结来说,枚举类的属性可以通过构造函数来初始化,这使得枚举类能够更加灵活地表示各种不同的常量及其相关信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值