假设您正在维护一个最初在几年前发布的 API(在 java 获得enum
支持之前),它定义了一个枚举值作为整数的类:
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 的用户来说混合两种枚举风格是不一致的。
我看到了三种可能的方法:
放弃并将新的枚举(
NutrientType
在我的虚构示例中)定义为一系列整数,如VitaminType
类。您获得了一致性,但您没有利用类型安全和其他现代功能。决定忍受已发布 API 中的不一致:保持
VitaminType
原样,并添加NutrientType
为enum
. 采用 aVitaminType
的方法仍被声明为采用 int,采用 a 的方法NutrientType
被声明为采用 int。弃用
VitaminType
该类并引入一个新的VitaminType2
枚举。将新定义NutrientType
为枚举。
恭喜,在接下来的 2-3 年中,直到您可以杀死已弃用的类型,您将处理每个将 aVitaminType
作为 int 的方法的弃用版本并添加每个方法的新foo(VitaminType2 v)
版本。您还需要为每个已弃用foo(int v)
的方法及其相应的foo(VitaminType2 v)
方法编写测试,因此您只是增加了 QA 工作量。
最好的方法是什么?