这里有一组自动和手动的步骤来进行重构。
步骤 1 在常量上封装字段
步骤 2 (可选)重命名常量。如果您想重用名称,请执行此操作。
第 3 步(手动)使用常量的值创建枚举。为枚举提供一个返回常量的 getValue 方法。
第 4 步(手动)将 getter 中的返回值替换为枚举中的 getValue。
步骤 5 内联 getter。选择“所有引用”和“删除方法声明”。
第 6 步内联常量。选择“所有引用”和“删除常量声明”。
如果你愿意,你可以在 6 之后停止,但要使用枚举的力量还有更多工作要做。
步骤 7 对于使用 enum.getValue() 作为参数的每个方法,将传递的常量替换为枚举。
步骤 7a 更改方法签名以将枚举添加为参数。
步骤 7b(手动)将枚举实例作为新参数与 getValue 调用一起传递。确保找到所有实例,否则以后会有问题。
步骤 7c(手动)在该方法中,使用新的枚举参数而不是常量。如果您在步骤 7b 中错过了一个电话,您的测试将在此处失败。
步骤 7d 更改方法签名以删除旧常量。
第 8 步(手动)对于布尔逻辑中 enum.getValue() 的每次使用,确定您是否可以使用 enum 代替。
步骤 9 如果不再使用 getValue 方法,可以将其删除。
步骤 9a(手动)删除未使用的 getValue 方法
步骤 9b(手动)删除构造函数中的字段和赋值。
步骤 9c 更改方法签名以从枚举构造函数中删除值。
步骤 9d(手动)如果没有其他参数,删除枚举构造函数。
例如:
public class Initial {
public static final String CONSTANT1 = "value1";
public static final String CONSTANT2 = "value2";
public void method(String aConstant)
{
if(aConstant.equals(CONSTANT2))
{
//do something
}
}
public void anotherMethod()
{
method(CONSTANT1);
}
}
第1步
private static final String CONSTANT1 = "value1";
private static final String CONSTANT2 = "value2";
public void method(String aConstant)
{
if(aConstant.equals(getConstant2()))
{
//do something
}
}
public void anotherMethod()
{
method(getConstant1());
}
public static String getConstant1() {
return CONSTANT1;
}
public static String getConstant2() {
return CONSTANT2;
}
步骤 2 重命名常量
private static final String _CONSTANT1 = "value1";
private static final String _CONSTANT2 = "value2";
...
public static String getConstant1() {
return _CONSTANT1;
}
public static String getConstant2() {
return _CONSTANT2;
}
步骤 3 创建枚举
public static enum AnEnum {
CONSTANT1(_CONSTANT1), CONSTANT2(_CONSTANT2);
private final String value;
AnEnum(String aValue)
{
value = aValue;
}
public String getValue()
{
return value;
}
}
步骤 4 替换常量 getter 中的返回值
public static String getConstant1() {
return AnEnum.CONSTANT1.getValue();
}
public static String getConstant2() {
return AnEnum.CONSTANT2.getValue();
}
步骤 5 内联常量 getter
public void method(String aConstant)
{
if(aConstant.equals(AnEnum.CONSTANT2.getValue()))
{
//do something
}
}
public void anotherMethod()
{
method(AnEnum.CONSTANT1.getValue());
}
第 6 步内联常量
public static enum AnEnum {
CONSTANT1("value1"), CONSTANT2("value2");
步骤 7a 更改方法签名以添加枚举作为参数。
public void method(String aConstant, AnEnum theEnum)
....
public void anotherMethod()
{
method(AnEnum.CONSTANT1.getValue(), null);
}
步骤 7b 将枚举实例作为新参数与 getValue 调用一起传递
public void anotherMethod()
{
method(AnEnum.CONSTANT1.getValue(), AnEnum.CONSTANT1);
}
步骤 7c 使用新的枚举参数而不是旧的传递值。
if(theEnum.getValue().equals(AnEnum.CONSTANT2.getValue()))
{
步骤 7d 更改方法签名以删除旧常量
public void method(AnEnum theEnum)
....
public void anotherMethod()
{
method(AnEnum.CONSTANT1);
}
第 8 步对于布尔逻辑中 enum.getValue() 的每次使用,确定您是否可以改用枚举。
if(theEnum.equals(AnEnum.CONSTANT2))
{
//do something
}
步骤 9a 删除未使用的 getValue 方法 步骤 9b(手动)删除构造函数中的字段和赋值。步骤 9c 更改方法签名以从枚举构造函数中删除值。步骤 9d(手动)如果没有其他参数,删除枚举构造函数。
public static enum AnEnum {
CONSTANT1, CONSTANT2;
}
所以最后代码看起来像这样:
public class Step9d {
public static enum AnEnum {
CONSTANT1, CONSTANT2;
}
public void method(AnEnum theEnum)
{
if(theEnum.equals(AnEnum.CONSTANT2))
{
//do something
}
}
public void anotherMethod()
{
method(AnEnum.CONSTANT1);
}
}