Java實現枚舉狀態(tài)轉換的方法詳解
場景描述
假設我們有一個電商系統(tǒng),包含兩個核心狀態(tài)枚舉:
- 訂單狀態(tài)(OrderStatusEnum) - 描述訂單在電商系統(tǒng)中的生命周期
- 物流狀態(tài)(ShippingStatusEnum) - 描述訂單在物流系統(tǒng)中的流轉狀態(tài)
這兩個狀態(tài)密切相關但又不完全相同,我們需要在它們之間建立轉換關系。
枚舉定義
1. 訂單狀態(tài)枚舉
/**
* 訂單狀態(tài)枚舉
*/
public enum OrderStatusEnum {
UNPAID(0, "待支付"),
PAID(1, "已支付"),
PACKAGED(2, "已打包"),
SHIPPED(3, "已發(fā)貨"),
DELIVERED(4, "已送達"),
COMPLETED(5, "已完成"),
CANCELLED(10, "已取消"),
REFUNDING(11, "退款中"),
REFUNDED(12, "已退款");
private final int code;
private final String description;
OrderStatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
// 根據code獲取枚舉實例
public static OrderStatusEnum fromCode(int code) {
for (OrderStatusEnum status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("無效的訂單狀態(tài)碼: " + code);
}
// 轉換為物流狀態(tài)
public ShippingStatusEnum toShippingStatus() {
switch (this) {
case UNPAID:
case PAID:
case CANCELLED:
case REFUNDING:
case REFUNDED:
return null; // 這些訂單狀態(tài)沒有對應的物流狀態(tài)
case PACKAGED:
return ShippingStatusEnum.PREPARING;
case SHIPPED:
return ShippingStatusEnum.IN_TRANSIT;
case DELIVERED:
return ShippingStatusEnum.DELIVERED;
case COMPLETED:
return ShippingStatusEnum.COMPLETED;
default:
throw new IllegalStateException("未知的訂單狀態(tài): " + this);
}
}
// getters
public int getCode() { return code; }
public String getDescription() { return description; }
}
2. 物流狀態(tài)枚舉
/**
* 物流狀態(tài)枚舉
*/
public enum ShippingStatusEnum {
PREPARING(1, "準備中"),
IN_TRANSIT(2, "運輸中"),
DELIVERED(3, "已送達"),
COMPLETED(4, "已完成"),
RETURNING(10, "退貨中"),
RETURNED(11, "已退貨");
private final int code;
private final String description;
ShippingStatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
// 根據code獲取枚舉實例
public static ShippingStatusEnum fromCode(int code) {
for (ShippingStatusEnum status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("無效的物流狀態(tài)碼: " + code);
}
// 轉換為訂單狀態(tài)
public OrderStatusEnum toOrderStatus() {
switch (this) {
case PREPARING:
return OrderStatusEnum.PACKAGED;
case IN_TRANSIT:
return OrderStatusEnum.SHIPPED;
case DELIVERED:
return OrderStatusEnum.DELIVERED;
case COMPLETED:
return OrderStatusEnum.COMPLETED;
case RETURNING:
return OrderStatusEnum.REFUNDING;
case RETURNED:
return OrderStatusEnum.REFUNDED;
default:
throw new IllegalStateException("未知的物流狀態(tài): " + this);
}
}
// getters
public int getCode() { return code; }
public String getDescription() { return description; }
}
關鍵設計點解析
狀態(tài)映射關系:
- 不是所有訂單狀態(tài)都有對應的物流狀態(tài)(如待支付、已取消等)
- 物流狀態(tài)可能觸發(fā)訂單狀態(tài)的變更(如退貨中對應退款中)
轉換方法設計:
- 每個枚舉類內部實現轉換方法,知道如何轉換為另一種狀態(tài)
- 方法命名直觀:
toShippingStatus()和toOrderStatus()
null值處理:
- 當沒有對應狀態(tài)時返回null,調用方需要處理這種情況
異常處理:
- 對非法狀態(tài)碼拋出明確的異常信息
使用示例
// 訂單狀態(tài)轉物流狀態(tài)
OrderStatusEnum orderStatus = OrderStatusEnum.SHIPPED;
ShippingStatusEnum shippingStatus = orderStatus.toShippingStatus();
System.out.println("訂單狀態(tài): " + orderStatus.getDescription()
+ " → 物流狀態(tài): " + (shippingStatus != null ? shippingStatus.getDescription() : "無"));
// 物流狀態(tài)轉訂單狀態(tài)
ShippingStatusEnum shippingStatus = ShippingStatusEnum.RETURNING;
OrderStatusEnum orderStatus = shippingStatus.toOrderStatus();
System.out.println("物流狀態(tài): " + shippingStatus.getDescription()
+ " → 訂單狀態(tài): " + orderStatus.getDescription());
最佳實踐建議
保持轉換邏輯簡單:如果轉換邏輯變得復雜,考慮引入狀態(tài)模式
文檔化映射關系:在枚舉類或項目文檔中明確記錄狀態(tài)映射關系
單元測試:為狀態(tài)轉換編寫單元測試,確保轉換邏輯正確
考慮性能:對于高頻調用的場景,可以緩存轉換結果
擴展性:設計時考慮未來可能新增的狀態(tài)
總結
通過在枚舉內部實現狀態(tài)轉換方法,我們實現了:
- 高內聚的設計:轉換邏輯與狀態(tài)定義在一起
- 易于維護:狀態(tài)變更時只需修改一處
- 類型安全:編譯時檢查狀態(tài)轉換
- 代碼清晰:直觀的轉換方法調用
這種模式不僅適用于訂單和物流狀態(tài),還可以應用于各種需要狀態(tài)轉換的場景,如工作流狀態(tài)、支付狀態(tài)等。
到此這篇關于Java實現枚舉狀態(tài)轉換的方法詳解的文章就介紹到這了,更多相關Java枚舉狀態(tài)轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java從零編寫吃貨聯(lián)盟訂餐系統(tǒng)全程講解
這篇文章主要介紹了Java訂餐系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-12-12

