java switch case 枚举类型的反编译结果

 package com.example.demo; import java.io.PrintStream; 
 // Referenced classes of package com.example.demo://  
          ab public class EnumTest{ public EnumTest(){}
           public static transient void main(string args[])
           {ab a = ab.aaa;
           /* anonymous class not found */
           class _anm1 {} 
           
           switch(_cls1..SwitchMap.com.example.demo.ab[a.ordinal()])
           {
            case 1: // '\001'system.out.println("aaa");
            // fall through 
           
            case 2: // '\002'system.out.println("bbb");
            // fall through
             default:return;
            
            }

}} 
取得 enum 的ordinal();
ordinal() 方法是public final 类型的,不可被override。

转载于:https://www.cnblogs.com/luoluoshidafu/p/7094508.html

<think>我们之前已经详细介绍了Java枚举类型的基本和高级用法,现在根据用户要求,我们需要再次回答关于Java枚举类型的问题,但这次要确保包含代码示例和解释,并在最后提出相关问题。 由于用户再次提出了相同的主题,我们可以提供更深入的内容或者不同的角度。但为了保持回答的丰富性,我们可以补充一些之前未提及的细节,例如枚举与模式匹配(Java 14+的switch表达式)、枚举的序列化、枚举与抽象方法结合实现策略模式等。 ### 深入Java枚举类型 #### 1. 枚举与Switch表达式(Java 14+) Java 14引入了增强的switch表达式,可以更简洁地处理枚举: ```java public class EnumSwitchExample { enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public static void main(String[] args) { Day day = Day.FRIDAY; String type = switch (day) { case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Weekday"; case SATURDAY, SUNDAY -> "Weekend"; }; System.out.println(day + " is a " + type); } } ``` #### 2. 枚举的序列化 枚举的序列化和反序列化是安全的,因为Java保证每个枚举常量只有一个实例。即使反序列化多次,得到的也是同一个对象。 ```java import java.io.*; public class EnumSerializationExample { enum Color { RED, GREEN, BLUE } public static void main(String[] args) throws Exception { Color original = Color.RED; // 序列化 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(original); oos.close(); // 反序列化 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); Color deserialized = (Color) ois.readObject(); System.out.println(original == deserialized); // true } } ``` #### 3. 枚举实现策略模式 枚举可以定义抽象方法,每个枚举常量实现不同的行为: ```java public enum Operation { ADD { public int apply(int a, int b) { return a + b; } }, SUBTRACT { public int apply(int a, int b) { return a - b; } }, MULTIPLY { public int apply(int a, int b) { return a * b; } }, DIVIDE { public int apply(int a, int b) { return a / b; } }; public abstract int apply(int a, int b); // 抽象方法 } // 使用 public class Calculator { public static void main(String[] args) { Operation add = Operation.ADD; System.out.println(add.apply(5, 3)); // 8 } } ``` #### 4. 枚举单例模式 枚举是实现单例模式的最佳方式,因为JVM保证枚举常量只会被实例化一次,且线程安全。 ```java public enum Singleton { INSTANCE; public void doSomething() { System.out.println("Singleton working"); } } // 使用 public class SingletonDemo { public static void main(String[] args) { Singleton.INSTANCE.doSomething(); } } ``` #### 5. 枚举的比较 枚举常量可以使用`==`比较,因为它们是单例的。也可以使用`equals()`方法,但`==`更推荐,因为它在编译时进行类型检查。 ```java Day day1 = Day.MONDAY; Day day2 = Day.MONDAY; System.out.println(day1 == day2); // true ``` ### 枚举的注意事项 - 枚举不能继承类(因为已经隐式继承了`java.lang.Enum`),但可以实现接口。 - 枚举的构造函数只能是`private`(默认),防止外部实例化。 - 枚举在静态初始化时创建,因此要注意静态初始化的顺序。 §§相关问题§§: 1. Java枚举在序列化和反序列化过程中如何保证单例? 2. 如何使用枚举实现状态机(State Machine)? 3. 枚举类型与Sealed Class(密封类)在Java 17中的结合使用? 4. 枚举类型在JVM内存中的存储结构是怎样的?</think>### Java 枚举类型深度解析 Java 枚举(`enum`)是一种特殊的类类型,用于定义固定数量的常量集合。它提供了类型安全、可维护性强且功能丰富的常量定义方式,比传统常量声明更强大。 #### 基本枚举定义 ```java public enum Status { PENDING, // 枚举常量 PROCESSING, COMPLETED, FAILED } ``` #### 高级枚举特性(带字段、方法和构造函数) ```java public enum HttpStatus { // 枚举常量(调用构造函数) OK(200, "OK"), NOT_FOUND(404, "Not Found"), SERVER_ERROR(500, "Internal Server Error"); private final int code; // 实例字段 private final String reason; // 实例字段 // 枚举构造函数(默认为 private) HttpStatus(int code, String reason) { this.code = code; this.reason = reason; } // 实例方法 public boolean isSuccess() { return code >= 200 && code < 300; } // 静态工厂方法 public static HttpStatus fromCode(int code) { for (HttpStatus status : values()) { if (status.code == code) return status; } throw new IllegalArgumentException("Invalid status code: " + code); } } ``` #### 枚举实现接口 ```java public interface Describable { String description(); } public enum LogLevel implements Describable { DEBUG("Diagnostic information"), INFO("Operational information"), WARN("Potential issues"), ERROR("Failure in current operation"); private final String description; LogLevel(String description) { this.description = description; } @Override public String description() { return description; } } ``` #### 枚举使用示例 ```java public class EnumExample { public static void main(String[] args) { // 1. 基本使用 Status currentStatus = Status.PROCESSING; System.out.println("Current status: " + currentStatus); // 2. 访问枚举字段和方法 HttpStatus status404 = HttpStatus.NOT_FOUND; System.out.println(status404.code + ": " + status404.reason); System.out.println("Is success? " + status404.isSuccess()); // 3. 使用静态方法 HttpStatus status500 = HttpStatus.fromCode(500); System.out.println("Status 500: " + status500); // 4. 实现接口的方法 LogLevel debug = LogLevel.DEBUG; System.out.println("Debug level: " + debug.description()); // 5. switch 语句中的枚举 switch (currentStatus) { case COMPLETED: System.out.println("Operation successful"); break; case FAILED: System.out.println("Operation failed"); break; default: System.out.println("Operation in progress"); } // 6. 遍历所有枚举值 System.out.println("\nAll HTTP statuses:"); for (HttpStatus s : HttpStatus.values()) { System.out.println(s.code + " - " + s.reason); } } } ``` #### 枚举的核心特性: 1. **类型安全**:编译时检查确保只能使用预定义的值 2. **单例保证**:每个枚举常量都是唯一的实例 3. **丰富的行为**:可以包含字段、方法、构造函数和实现接口 4. **内置方法**: - `values()`:返回包含所有枚举常量的数组 - `valueOf(String name)`:根据名称获取枚举常量 - `name()`:获取枚举常量的声明名称 - `ordinal()`:获取枚举常量的声明位置(从0开始) 5. **集合支持**:专用集合类 `EnumSet` 和 `EnumMap` 提供高性能操作 #### 枚举设计模式应用 **状态机实现示例**: ```java public enum OrderState { NEW { @Override public OrderState nextState() { return PROCESSING; } }, PROCESSING { @Override public OrderState nextState() { return SHIPPED; } }, SHIPPED { @Override public OrderState nextState() { return DELIVERED; } }, DELIVERED { @Override public OrderState nextState() { return this; // 终态 } }; public abstract OrderState nextState(); } ``` **单例模式实现**: ```java public enum DatabaseConnection { INSTANCE; private Connection connection; private DatabaseConnection() { // 初始化数据库连接 try { connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "pass"); } catch (SQLException e) { throw new RuntimeException("Database connection failed", e); } } public Connection getConnection() { return connection; } } // 使用方式:DatabaseConnection.INSTANCE.getConnection() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值