首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Enum 枚舉類型完整指南:基本用法、帶參構造、實現介面、策略模式

     編輯:Java 相關知識

前言

Java 5 引入 enum,不僅是常量集合,更是功能完整的類,可攜帶屬性、方法、實現介面。本文從基礎到進階全面解析。

1. 基礎語法

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

// 使用
Season s = Season.SPRING;
System.out.println(s.name());        // SPRING
System.out.println(s.ordinal());     // 0
System.out.println(Season.valueOf("SUMMER")); // SUMMER
for (Season ss : Season.values()) { ... }

2. 帶參數構造與屬性

public enum HttpStatus {
    OK(200, "成功"),
    NOT_FOUND(404, "未找到"),
    SERVER_ERROR(500, "伺服器錯誤");
    
    private final int code;
    private final String msg;
    
    HttpStatus(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public int getCode() { return code; }
    public String getMsg() { return msg; }
    
    // 靜態查找
    public static HttpStatus fromCode(int code) {
        for (HttpStatus s : values()) {
            if (s.code == code) return s;
        }
        throw new IllegalArgumentException("Unknown code: " + code);
    }
}

3. 實現介面與多態行為

public interface DiscountStrategy {
    double apply(double price);
}

public enum DiscountType implements DiscountStrategy {
    NONE(0) {
        public double apply(double price) { return price; }
    },
    VIP(10) {
        public double apply(double price) { return price * 0.9; }
    },
    SUPER_VIP(20) {
        public double apply(double price) { return price * 0.8; }
    };
    
    private final int level;
    DiscountType(int level) { this.level = level; }
}

// 使用
DiscountStrategy strategy = DiscountType.VIP;
double finalPrice = strategy.apply(100); // 90.0

4. 策略模式實戰:支付渠道枚舉

public enum PayChannel implements PaymentProcessor {
    ALIPAY("支付寶") {
        public void pay(double amt) { System.out.println("支付寶支付 " + amt); }
    },
    WECHAT("微信支付") {
        public void pay(double amt) { System.out.println("微信支付 " + amt); }
    },
    UNIONPAY("銀聯") {
        public void pay(double amt) { System.out.println("銀聯支付 " + amt); }
    };
    
    private final String name;
    PayChannel(String name) { this.name = name; }
    public String getName() { return name; }
    
    public static PayChannel fromName(String name) {
        for (PayChannel c : values()) {
            if (c.name.equals(name)) return c;
        }
        throw new IllegalArgumentException("不支援的渠道: " + name);
    }
}

interface PaymentProcessor {
    void pay(double amount);
}

5. EnumSet / EnumMap 高效集合

// EnumSet:位向量實現,極快
Set active = EnumSet.of(DiscountType.VIP, DiscountType.SUPER_VIP);

// EnumMap:陣列實現,鍵為 Enum
Map descMap = new EnumMap<>(HttpStatus.class);
descMap.put(HttpStatus.OK, "請求成功");

6. 序列化與反射注意點

  • Enum 序列化自動處理,僅寫入名稱,反序列化調用 valueOf,防止單例破壞。
  • 反射獲取枚舉常量:Season.class.getEnumConstants()。
  • Switch 表達式(Java 12+)完美支援:
String desc = switch (status) {
    case OK -> "成功";
    case NOT_FOUND -> "未找到";
    default -> "未知";
};

7. 最佳實務清單

  1. 枚舉常量全大寫,單詞用下劃線分隔。
  2. 構造器私有(預設即私有),字段 final 確保不可變。
  3. 提供 fromXxx 靜態工廠方法,避免調用方硬編碼 valueOf。
  4. 實現介面替代大量 if-else,提升擴展性。
  5. 文檔註釋每個常量的業務含義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved