假設你保持最初公佈年前的API(Java之前獲得enum
支持),它定義了枚舉值一類爲int:當一個API發展時,處理「int enum」模式與java枚舉共存的最佳方式是什麼?
public class VitaminType {
public static final int RETINOL = 0;
public static final int THIAMIN = 1;
public static final int RIBOFLAVIN = 2;
}
多年來的API已經演變並獲得了Java的5特有的功能(基因接口等)。現在,你要添加一個新的枚舉:
public enum NutrientType {
AMINO_ACID, SATURATED_FAT, UNSATURATED_FAT, CARBOHYDRATE;
}
的「老式」 INT-枚舉圖案不具有類型安全,無添加的行爲或數據的可能性等,但它的發佈和使用 。我擔心混合兩種樣式的枚舉對API的用戶不一致。
我看到三種可能的途徑:
放棄和(在我虛構的例子
NutrientType
)定義新的枚舉爲一系列像VitaminType
類整數的。你得到一致性,但你沒有利用類型安全和其他現代功能。決定與矛盾過上公佈的API中:保持
VitaminType
各地原樣,並添加NutrientType
作爲enum
。採用VitaminType
的方法仍然被聲明爲接受int,那麼採用NutrientType
的方法被聲明爲採用這種方法。擯棄
VitaminType
課程,並引入新的VitaminType2
enum。將新的NutrientType
定義爲枚舉。
祝賀,對未來2 - 3年,直到你能殺了不推薦使用的類型,你要對付的是花了VitaminType
爲int每個單獨的方法不建議使用的版本,並增加了新的foo(VitaminType2 v)
每個版本的。您還需要爲每個已棄用的foo(int v)
方法以及相應的foo(VitaminType2 v)
方法編寫測試,因此您只需將您的QA工作量增加一倍。
什麼是最好的方法?