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