enum 关键字

概述

enum 关键字用于定义枚举类型,表示一组固定的常量。枚举提供了类型安全的常量定义方式。

语法格式

public enum EnumName {
    VALUE1, VALUE2, VALUE3
}

// 带构造器和方法的枚举
public enum EnumName {
    VALUE1(param1), VALUE2(param2);

    private final Type field;

    EnumName(Type param) {
        this.field = param;
    }
}

基本用法

// 简单枚举
public enum Color {
    RED, GREEN, BLUE, YELLOW
}

// 星期枚举
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class EnumExample {
    public static void main(String[] args) {
        // 使用枚举
        Color favoriteColor = Color.BLUE;
        Day today = Day.FRIDAY;

        System.out.println("喜欢的颜色: " + favoriteColor);
        System.out.println("今天是: " + today);

        // 枚举比较
        if (favoriteColor == Color.BLUE) {
            System.out.println("喜欢蓝色");
        }

        // 遍历所有枚举值
        System.out.println("所有颜色:");
        for (Color color : Color.values()) {
            System.out.println("- " + color);
        }

        // 获取枚举的序号
        System.out.println("蓝色的序号: " + Color.BLUE.ordinal());

        // 根据名称获取枚举
        Color red = Color.valueOf("RED");
        System.out.println("通过名称获取: " + red);
    }
}

复杂枚举示例

// 带构造器和方法的枚举
public enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6),
    MARS(6.421e+23, 3.3972e6),
    JUPITER(1.9e+27, 7.1492e7),
    SATURN(5.688e+26, 6.0268e7),
    URANUS(8.686e+25, 2.5559e7),
    NEPTUNE(1.024e+26, 2.4746e7);

    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() {
        return 6.67300E-11 * mass / (radius * radius);
    }

    // 计算在该星球上的重量
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

public class PlanetExample {
    public static void main(String[] args) {
        double earthWeight = 75.0; // 地球上的重量 (千克)

        System.out.println("在地球上重量为 " + earthWeight + " 千克");
        System.out.println("在其他星球上的重量:");

        for (Planet planet : Planet.values()) {
            System.out.printf("%-10s: %.2f 千克%n", 
                planet, planet.surfaceWeight(earthWeight));
        }
    }
}

枚举中的抽象方法

public enum Operation {
    PLUS("+") {
        @Override
        public double apply(double x, double y) {
            return x + y;
        }
    },
    MINUS("-") {
        @Override
        public double apply(double x, double y) {
            return x - y;
        }
    },
    TIMES("*") {
        @Override
        public double apply(double x, double y) {
            return x * y;
        }
    },
    DIVIDE("/") {
        @Override
        public double apply(double x, double y) {
            return x / y;
        }
    };

    private final String symbol;

    Operation(String symbol) {
        this.symbol = symbol;
    }

    public String getSymbol() {
        return symbol;
    }

    // 抽象方法
    public abstract double apply(double x, double y);

    @Override
    public String toString() {
        return symbol;
    }
}

public class OperationExample {
    public static void main(String[] args) {
        double x = 10.0;
        double y = 3.0;

        for (Operation op : Operation.values()) {
            System.out.printf("%.1f %s %.1f = %.2f%n", 
                x, op, y, op.apply(x, y));
        }
    }
}

枚举在switch中的使用

public enum Status {
    PENDING("待处理"),
    PROCESSING("处理中"),
    COMPLETED("已完成"),
    FAILED("失败");

    private final String description;

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

    public String getDescription() {
        return description;
    }
}

public class StatusProcessor {
    public static void processStatus(Status status) {
        switch (status) {
            case PENDING:
                System.out.println("任务等待处理");
                break;
            case PROCESSING:
                System.out.println("任务正在处理中...");
                break;
            case COMPLETED:
                System.out.println("任务已完成");
                break;
            case FAILED:
                System.out.println("任务处理失败");
                break;
            default:
                System.out.println("未知状态");
        }
    }

    public static void main(String[] args) {
        for (Status status : Status.values()) {
            System.out.println("状态: " + status.getDescription());
            processStatus(status);
            System.out.println("---");
        }
    }
}

枚举集合

import java.util.*;

public class EnumSetExample {
    public static void main(String[] args) {
        // 使用EnumSet
        EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
        EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);

        System.out.println("工作日: " + weekdays);
        System.out.println("周末: " + weekend);

        // 使用EnumMap
        EnumMap<Color, String> colorNames = new EnumMap<>(Color.class);
        colorNames.put(Color.RED, "红色");
        colorNames.put(Color.GREEN, "绿色");
        colorNames.put(Color.BLUE, "蓝色");

        System.out.println("颜色名称:");
        for (Map.Entry<Color, String> entry : colorNames.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

最佳实践

  1. 使用枚举替代常量

    // 不好的做法
    public static final int STATUS_PENDING = 1;
    public static final int STATUS_PROCESSING = 2;
    public static final int STATUS_COMPLETED = 3;
    
    // 好的做法
    public enum Status {
        PENDING, PROCESSING, COMPLETED
    }
    
  2. 为枚举添加有意义的方法

    public enum Priority {
        LOW(1), MEDIUM(5), HIGH(10);
    
        private final int level;
    
        Priority(int level) {
            this.level = level;
        }
    
        public boolean isHigherThan(Priority other) {
            return this.level > other.level;
        }
    }
    
  3. 使用枚举实现单例模式

    public enum Singleton {
        INSTANCE;
    
        public void doSomething() {
            System.out.println("执行操作");
        }
    }
    

enum关键字提供了类型安全、性能优秀的常量定义方式,是Java编程中的重要特性。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 16:25:54

results matching ""

    No results matching ""