11

如何使用 Eclipse 将 Java 常量重构为枚举?

我在 Eclipse 中没有发现内置功能: http ://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-menu-refactor.htm

我找到了一个插件: http ://code.google.com/p/constants-to-enum-eclipse-plugin/ 。我想知道插件是要走的路还是有人使用更好的方法。

我总是可以自己创建一个枚举类并剪切和粘贴 2012 年乏味的常量。请不要将我指向另一个 IDE,我太老了,也改变了坏习惯;-)

4

2 回答 2

3

这里有一组自动和手动的步骤来进行重构。

步骤 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);
}

}
于 2014-12-12T11:50:02.750 回答
2

重构永远不会改变“外部行为”!

例如:

public enum Test {
    NAME1("abc");

    Test(String name) {}

    public static final String _NAME1="abc";
    public static void main(String[] args) {
        String k = Test._NAME1;
        String m = Test.NAME1;
    }
}

如果重构_NAME1NAME1(enum) ,则代码在m. 重构永远不会成功!

于 2012-11-06T11:26:16.207 回答