假设你正在维护一个API,这个API在几年前发布(当时Java还没有支持"enum"),并且它定义了一个将枚举值作为整数的类:
多年来,API 已经发展并获得了 Java 5 特定的功能(泛型接口等)。现在你将要添加一个新的枚举:
“旧式” int-enum 模式没有类型安全性,没有添加行为或数据的可能性等,但是它已经发布并且在使用。我担心混合两种枚举风格对 API 的用户来说是不一致的。 我看到有三种可能的方法:
1. 放弃并像虚构例子中的 VitaminType 类一样将新枚举(NutrientType)定义为一系列 int。这样会得到一致性,但你没有利用类型安全和其他现代特性。
2. 决定在已发布的 API 中保留不一致性:保留 VitaminType 并按原样增加 NutrientType 作为枚举。接受一个 VitaminType 的方法仍然声明为接受一个 int,接受一个 NutrientType 的方法也是如此。
3. 废弃 VitaminType 类并引入一个新的 VitaminType2 枚举。定义新的 NutrientType 作为枚举。祝贺你,未来 2-3 年直到你可以消除废弃类型之前,你将处理每个以 int 形式获取 VitaminType 的方法的废弃版本,并添加每个 foo(VitaminType2 v) 版本。你还需要为每个废弃的 foo(int v) 方法编写测试以及其相应的 foo(VitaminType2 v) 方法,因此您将使 QA 工作量增加。
哪种方法最好?
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-enum 模式没有类型安全性,没有添加行为或数据的可能性等,但是它已经发布并且在使用。我担心混合两种枚举风格对 API 的用户来说是不一致的。 我看到有三种可能的方法:
1. 放弃并像虚构例子中的 VitaminType 类一样将新枚举(NutrientType)定义为一系列 int。这样会得到一致性,但你没有利用类型安全和其他现代特性。
2. 决定在已发布的 API 中保留不一致性:保留 VitaminType 并按原样增加 NutrientType 作为枚举。接受一个 VitaminType 的方法仍然声明为接受一个 int,接受一个 NutrientType 的方法也是如此。
3. 废弃 VitaminType 类并引入一个新的 VitaminType2 枚举。定义新的 NutrientType 作为枚举。祝贺你,未来 2-3 年直到你可以消除废弃类型之前,你将处理每个以 int 形式获取 VitaminType 的方法的废弃版本,并添加每个 foo(VitaminType2 v) 版本。你还需要为每个废弃的 foo(int v) 方法编写测试以及其相应的 foo(VitaminType2 v) 方法,因此您将使 QA 工作量增加。
哪种方法最好?