如何在 Java switch 语句中使用枚举

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程探讨了Java中枚举(enum)和switch语句的强大组合,为开发者提供了增强代码结构和可维护性的实用技巧。通过了解如何在switch语句中利用枚举,程序员可以创建更健壮、类型安全的代码,从而改善整体软件设计和可读性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ProgrammingTechniquesGroup(["Programming Techniques"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/BasicSyntaxGroup -.-> java/switch("Switch") java/ProgrammingTechniquesGroup -.-> java/method_overloading("Method Overloading") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/oop("OOP") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/enums("Enums") subgraph Lab Skills java/switch -.-> lab-425180{{"如何在 Java switch 语句中使用枚举"}} java/method_overloading -.-> lab-425180{{"如何在 Java switch 语句中使用枚举"}} java/classes_objects -.-> lab-425180{{"如何在 Java switch 语句中使用枚举"}} java/oop -.-> lab-425180{{"如何在 Java switch 语句中使用枚举"}} java/enums -.-> lab-425180{{"如何在 Java switch 语句中使用枚举"}} end

Java 中的枚举基础

什么是枚举?

在 Java 中,枚举(enumeration)是一种特殊的类,用于定义一组常量。枚举提供了一种创建一组相关常量的方式,其功能比传统的静态常量(static final variables)更强大。

定义枚举

以下是 Java 中枚举的一个基本示例:

public enum DaysOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

枚举的特性

Java 中的枚举具有几个重要特性:

特性 描述
类型安全 枚举提供编译时的类型安全
单例模式 每个枚举常量都是一个单例实例
方法 枚举可以拥有方法、构造函数和字段

创建具有附加属性的枚举

public enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6);

    private final double mass;   // 以千克为单位
    private final double radius; // 以米为单位

    // 构造函数
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // 计算表面重力的方法
    public double surfaceGravity() {
        final double G = 6.67300E-11;
        return G * mass / (radius * radius);
    }
}

枚举方法和行为

枚举自带一些内置方法:

DaysOfWeek day = DaysOfWeek.MONDAY;
System.out.println(day.name());           // 输出 "MONDAY"
System.out.println(day.ordinal());         // 输出 0(枚举中的索引)
System.out.println(day.toString());        // 输出 "MONDAY"

枚举在 switch 语句中的使用

枚举与 switch 语句配合得非常好:

DaysOfWeek day = DaysOfWeek.WEDNESDAY;
switch (day) {
    case MONDAY:
        System.out.println("工作周开始");
        break;
    case WEDNESDAY:
        System.out.println("工作周中间");
        break;
    case FRIDAY:
        System.out.println("工作周结束");
        break;
    default:
        System.out.println("周末");
}

枚举迭代

你可以轻松地遍历枚举常量:

for (DaysOfWeek day : DaysOfWeek.values()) {
    System.out.println(day);
}

为什么使用枚举?

  • 提供类型安全
  • 提高代码可读性
  • 表示一组固定的常量
  • 允许更复杂的常量定义

在 LabEx,我们建议在 Java 应用程序中使用枚举来创建更健壮、更有意义的代码结构。

带有 switch 语句的枚举

枚举 switch 语句简介

带有枚举的 switch 语句提供了一种简洁且类型安全的方式来处理不同的枚举常量。与传统的 if - else 结构相比,它们的代码更具可读性和简洁性。

基本枚举 switch 示例

public enum TrafficLight {
    RED, YELLOW, GREEN
}

public class TrafficController {
    public static void handleTrafficLight(TrafficLight light) {
        switch (light) {
            case RED:
                System.out.println("Stop");
                break;
            case YELLOW:
                System.out.println("Prepare to stop");
                break;
            case GREEN:
                System.out.println("Go");
                break;
        }
    }
}

switch 表达式(Java 12+)

public static String getTrafficInstruction(TrafficLight light) {
    return switch (light) {
        case RED -> "Absolutely stop";
        case YELLOW -> "Slow down";
        case GREEN -> "Proceed safely";
    };
}

枚举 switch 流程可视化

graph TD A[Enum Switch] --> B{Enum Constant} B -->|RED| C[Stop Action] B -->|YELLOW| D[Caution Action] B -->|GREEN| E[Go Action]

处理多个情况

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public static void printDayType(Day day) {
    switch (day) {
        case SATURDAY:
        case SUNDAY:
            System.out.println("Weekend");
            break;
        default:
            System.out.println("Weekday");
    }
}

枚举 switch 模式

模式 描述 示例
简单 switch 基本常量匹配 switch (light) { case RED:... }
多情况匹配 处理多个常量 case SATURDAY: case SUNDAY:...
switch 表达式 现代语法(Java 12+) switch (day) { case MONDAY ->... }

高级枚举 switch 技术

enum PaymentMethod {
    CREDIT_CARD, DEBIT_CARD, PAYPAL, CASH
}

public static double applyDiscount(PaymentMethod method, double amount) {
    return switch (method) {
        case CREDIT_CARD, DEBIT_CARD -> amount * 0.95;
        case PAYPAL -> amount * 0.97;
        case CASH -> amount;
    };
}

要避免的常见陷阱

  • 始终包含默认情况或处理所有枚举常量
  • 注意 switch 表达式中的详尽检查
  • 在传统 switch 语句中使用 break 语句

最佳实践

  • 对于有限的、已知的常量集,使用枚举和 switch
  • 在 Java 12+ 中,优先使用 switch 表达式以获得更简洁的代码
  • 确保类型安全和可读性

在 LabEx,我们建议掌握枚举 switch 模式,以编写更优雅、更易于维护的 Java 代码。

实用枚举模式

枚举状态机模式

public enum OrderStatus {
    PENDING {
        @Override
        public void nextStatus(Order order) {
            order.setStatus(PROCESSING);
        }
    },
    PROCESSING {
        @Override
        public void nextStatus(Order order) {
            order.setStatus(SHIPPED);
        }
    },
    SHIPPED {
        @Override
        public void nextStatus(Order order) {
            order.setStatus(DELIVERED);
        }
    },
    DELIVERED {
        @Override
        public void nextStatus(Order order) {
            // 最终状态
        }
    };

    public abstract void nextStatus(Order order);
}

枚举单例模式

public enum DatabaseConnection {
    INSTANCE;

    private Connection connection;

    private DatabaseConnection() {
        // 初始化数据库连接
        connection = createConnection();
    }

    public Connection getConnection() {
        return connection;
    }

    private Connection createConnection() {
        // 实际的连接逻辑
        return null;
    }
}

枚举策略模式

public enum PaymentStrategy {
    CREDIT_CARD {
        @Override
        public void pay(double amount) {
            System.out.println("使用信用卡支付 " + amount);
        }
    },
    PAYPAL {
        @Override
        public void pay(double amount) {
            System.out.println("使用PayPal支付 " + amount);
        }
    },
    BANK_TRANSFER {
        @Override
        public void pay(double amount) {
            System.out.println("通过银行转账支付 " + amount);
        }
    };

    public abstract void pay(double amount);
}

枚举验证模式

public enum ValidationRule {
    EMAIL {
        @Override
        public boolean validate(String input) {
            return input.matches("^[A-Za-z0-9+_.-]+@(.+)$");
        }
    },
    PHONE_NUMBER {
        @Override
        public boolean validate(String input) {
            return input.matches("^\\d{10}$");
        }
    },
    PASSWORD {
        @Override
        public boolean validate(String input) {
            return input.length() >= 8;
        }
    };

    public abstract boolean validate(String input);
}

枚举配置模式

public enum AppConfiguration {
    INSTANCE;

    private Map<String, String> configMap = new HashMap<>();

    public void setConfig(String key, String value) {
        configMap.put(key, value);
    }

    public String getConfig(String key) {
        return configMap.get(key);
    }

    public String getConfig(String key, String defaultValue) {
        return configMap.getOrDefault(key, defaultValue);
    }
}

枚举模式比较

模式 使用场景 主要优点
状态机 管理对象状态 封装状态转换
单例 全局资源管理 线程安全的单例实例
策略 算法选择 灵活的行为切换
验证 输入验证 集中式验证规则
配置 应用程序设置 集中式配置管理

枚举流程可视化

graph TD A[Enum Pattern] --> B{Type of Pattern} B -->|State Machine| C[Manage Object States] B -->|Singleton| D[Ensure Single Instance] B -->|Strategy| E[Dynamic Behavior Selection] B -->|Validation| F[Input Validation Rules] B -->|Configuration| G[Application Settings]

最佳实践

  • 对于一组固定的相关常量使用枚举
  • 利用枚举方法实现复杂行为
  • 相对于传统实现,优先选择枚举模式
  • 保持枚举实现专注且简单

在 LabEx,我们建议探索这些实用的枚举模式,以编写更健壮、更易于维护的 Java 代码。

总结

Java 中枚举(enum)和 switch 语句的结合为开发者提供了一种成熟的方法,用于处理多种状态和条件,同时提高了类型安全性和代码清晰度。通过掌握这些技术,程序员能够编写更具表现力、可维护且高效的代码,充分利用 Java 强大的类型系统,并为传统条件逻辑提供更简洁的替代方案。