問題背景
由于 Java 不允許枚舉繼承另一個枚舉(enum cannot extend enum
),但可以通過 組合方式 或 工具類 來實現類似功能。
? 解決方案一:組合方式引入原始枚舉值
示例代碼:
public enum CustomErrorCodeEnum implements IErrorInfo {// 組合方式:關聯 ErrorCodeEnum 值CUSTOM_CODE_1(800001, "雨量過大", ErrorCodeEnum.BATTERY_LOW),CUSTOM_CODE_2(800002, "風速過大", ErrorCodeEnum.NO_HOME_POINT),UNKNOWN(-1, "未知錯誤。", null);private final int code;private final String msg;private final ErrorCodeEnum originEnum; // 保存原始枚舉值CustomErrorCodeEnum(int code, String msg, ErrorCodeEnum originEnum) {this.code = code;this.msg = msg;this.originEnum = originEnum;}@Overridepublic String getMessage() {return msg;}@Overridepublic Integer getCode() {return code;}/*** 獲取對應的原始 ErrorCodeEnum 實例*/public ErrorCodeEnum getOriginEnum() {return originEnum;}
}
使用示例:
CustomErrorCodeEnum error = CustomErrorCodeEnum.CUSTOM_CODE_1;
if (error.getOriginEnum() != null) {System.out.println("原始錯誤碼名稱:" + error.getOriginEnum());System.out.println("原始錯誤碼描述:" + error.getOriginEnum().getMessage());
}
? 解決方案二:靜態方法獲取所有原始枚舉值(調用 ErrorCodeEnum.values()
)
如果你只是需要訪問 ErrorCodeEnum.values()
,不需要映射到每個自定義錯誤碼,可以直接通過靜態方法調用:
public class CustomErrorCodeEnum implements IErrorInfo {// ... 其他字段和構造函數不變 .../*** 獲取所有原始 ErrorCodeEnum 值*/public static ErrorCodeEnum[] getOriginalEnums() {return ErrorCodeEnum.values();}
}
調用示例:
for (ErrorCodeEnum error : CustomErrorCodeEnum.getOriginalEnums()) {System.out.println(error.getMessage());
}
? 方案三(推薦):使用工具類統一管理
創建一個工具類用于聚合所有錯誤碼信息,便于統一處理不同來源的錯誤碼:
public class ErrorUtils {private static final Map<Integer, String> ERROR_MAP = new HashMap<>();static {for (ErrorCodeEnum error : ErrorCodeEnum.values()) {ERROR_MAP.put(error.getCode(), error.getMessage());}// 可選:加入自定義錯誤碼for (CustomErrorCodeEnum customError : CustomErrorCodeEnum.values()) {ERROR_MAP.put(customError.getCode(), customError.getMessage());}}public static String getMessageByCode(Integer code) {return ERROR_MAP.getOrDefault(code, "未定義的錯誤碼");}
}
調用示例:
System.out.println(ErrorUtils.getMessageByCode(800001));
📝 總結建議
方法 | 描述 |
---|---|
? 組合方式 | 將原始枚舉值嵌入每個自定義錯誤碼中,便于雙向查找 |
? 靜態代理方法 | 提供便捷 API 獲取原始枚舉數組 |
? 工具類聚合 | 更靈活地統一管理多個錯誤源、簡化維護 |
? 不推薦繼承 enum | Java 不支持,會編譯報錯 |
如需進一步整合錯誤碼,比如統一序列化 / 映射 / 異常處理機制,可以繼續擴展工具類或采用策略模式。