Java案例怎么自定义枚举属性?

wen java案例 8

本文目录导读:

Java案例怎么自定义枚举属性?

  1. 基本属性自定义
  2. 使用示例
  3. 更复杂的实例 - 订单状态枚举
  4. 含抽象方法的枚举
  5. 使用接口实现多态
  6. 测试代码
  7. 最佳实践建议

在Java中,自定义枚举属性通常是指在枚举常量中添加字段、构造函数和方法,以下是几种常见的实现方式:

基本属性自定义

public enum Weekday {
    MONDAY("星期一", 1),
    TUESDAY("星期二", 2),
    WEDNESDAY("星期三", 3),
    THURSDAY("星期四", 4),
    FRIDAY("星期五", 5),
    SATURDAY("星期六", 6),
    SUNDAY("星期日", 7);
    // 自定义属性
    private final String chineseName;
    private final int value;
    // 构造函数
    Weekday(String chineseName, int value) {
        this.chineseName = chineseName;
        this.value = value;
    }
    // Getter方法
    public String getChineseName() {
        return chineseName;
    }
    public int getValue() {
        return value;
    }
}

使用示例

public class EnumDemo {
    public static void main(String[] args) {
        // 获取枚举常量
        Weekday today = Weekday.MONDAY;
        // 访问自定义属性
        System.out.println("英文名: " + today.name());  // MONDAY
        System.out.println("中文名: " + today.getChineseName());  // 星期一
        System.out.println("数值: " + today.getValue());  // 1
        // 遍历所有枚举
        for (Weekday day : Weekday.values()) {
            System.out.println(day.name() + " - " + day.getChineseName());
        }
        // 根据值查找枚举
        Weekday found = getByValue(3);
        System.out.println("数值3对应: " + found.getChineseName());  // 星期三
    }
    // 根据value查找枚举
    public static Weekday getByValue(int value) {
        for (Weekday day : Weekday.values()) {
            if (day.getValue() == value) {
                return day;
            }
        }
        return null;
    }
}

更复杂的实例 - 订单状态枚举

public enum OrderStatus {
    PENDING("待处理", 0, "订单已创建,等待处理"),
    PROCESSING("处理中", 1, "订单正在处理"),
    SHIPPED("已发货", 2, "订单已发货,等待签收"),
    DELIVERED("已签收", 3, "订单已完成签收"),
    CANCELLED("已取消", -1, "订单已取消");
    private final String displayName;
    private final int code;
    private final String description;
    OrderStatus(String displayName, int code, String description) {
        this.displayName = displayName;
        this.code = code;
        this.description = description;
    }
    // 获取所有属性
    public String getDisplayName() { return displayName; }
    public int getCode() { return code; }
    public String getDescription() { return description; }
    // 根据code获取枚举
    public static OrderStatus fromCode(int code) {
        for (OrderStatus status : OrderStatus.values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid code: " + code);
    }
    // 判断是否可以取消
    public boolean canCancel() {
        return this == PENDING || this == PROCESSING;
    }
    // 判断是否是最终状态
    public boolean isFinalStatus() {
        return this == DELIVERED || this == CANCELLED;
    }
}

含抽象方法的枚举

public enum Operation {
    ADD("+") {
        @Override
        public double apply(double x, double y) {
            return x + y;
        }
    },
    SUBTRACT("-") {
        @Override
        public double apply(double x, double y) {
            return x - y;
        }
    },
    MULTIPLY("*") {
        @Override
        public double apply(double x, double y) {
            return x * y;
        }
    },
    DIVIDE("/") {
        @Override
        public double apply(double x, double y) {
            if (y == 0) {
                throw new ArithmeticException("除数不能为0");
            }
            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);
}

使用接口实现多态

// 定义接口
interface Action {
    void execute();
}
// 枚举实现接口
public enum Command implements Action {
    START("开始") {
        @Override
        public void execute() {
            System.out.println("执行开始操作...");
        }
    },
    STOP("停止") {
        @Override
        public void execute() {
            System.out.println("执行停止操作...");
        }
    },
    PAUSE("暂停") {
        @Override
        public void execute() {
            System.out.println("执行暂停操作...");
        }
    };
    private final String displayName;
    Command(String displayName) {
        this.displayName = displayName;
    }
    public String getDisplayName() {
        return displayName;
    }
}

测试代码

public class EnumTest {
    public static void main(String[] args) {
        // 测试订单状态
        OrderStatus status = OrderStatus.PROCESSING;
        System.out.println("状态: " + status.getDisplayName());
        System.out.println("状态码: " + status.getCode());
        System.out.println("描述: " + status.getDescription());
        System.out.println("是否可以取消: " + status.canCancel());
        // 测试操作枚举
        Operation op = Operation.ADD;
        System.out.println("\n" + 10 + " " + op.getSymbol() + " " + 5 + " = " + op.apply(10, 5));
        // 测试命令枚举
        Command cmd = Command.START;
        System.out.println("\n执行命令: " + cmd.getDisplayName());
        cmd.execute();
    }
}

最佳实践建议

  1. 属性声明为 final:枚举属性通常是不可变的,声明为 final
  2. 使用私有构造函數:避免外部创建枚举实例
  3. 提供合适的查找方法:如 fromCode()getByValue()
  4. 考虑使用抽象方法:当枚举常量需要不同行为时
  5. 实现接口:增强枚举的灵活性和可扩展性

自定义枚举属性可以使代码更清晰、类型安全,并减少使用魔法值(magic numbers/strings)的情况。

抱歉,评论功能暂时关闭!