簡體   English   中英

如何在Eclipse中將常量重構為枚舉?

[英]How to refactor constants to enums in Eclipse?

如何使用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/ 我想知道插件是否可行,或者是否有人使用更好的方法。

我總是可以自己創建一個enum類來剪切和粘貼常量,這在2012年是乏味的。請不要指向另一個IDE,我太老太改變壞習慣;-)

以下是執行此重構的一組自動和手動步驟。

步驟1在常量上封裝字段

步驟2(可選)重命名常量。 如果要重用名稱,請執行此操作。

步驟3(手動)使用常量的值創建枚舉。 為枚舉提供一個返回常量的getValue方法。

步驟4(手動)使用枚舉中的getValue替換getter中的返回值。

步驟5內聯吸氣劑。 選擇“所有參考”和“刪除方法聲明”。

第6步內聯常量。 選擇“所有參考”和“刪除常量聲明”。

如果你願意,可以在6之后停止,但要使用枚舉的功能還有很多工作要做。

步驟7對於使用enum.getValue()作為參數的每個方法,替換使用枚舉傳遞的常量。

步驟7a更改方法簽名以將Enum添加為參數。

步驟7b(手動)將enum實例作為新參數傳遞給getValue調用。 確保找到所有實例,否則以后會出現問題。

步驟7c(手動)在該方法中,使用新的枚舉參數而不是常量。 如果您在步驟7b中錯過了呼叫,則此處的測試將失敗。

步驟7d更改方法簽名以刪除舊的常量。

步驟8(手動)對於布爾邏輯中enum.getValue()的每次使用,確定是否可以使用枚舉。

步驟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替換Constant getters中的返回值

    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將enum實例作為新參數傳遞給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);
}

}

重構永遠不會改變“外部行為”!

例如:

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;
    }
}

如果將_NAME1重構為NAME1 (枚舉),則代碼會在m實例化時崩潰。 重構永遠不會成功!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM