2012-11-06 15 views
11

eclipseで列挙型にJava定数をリファクタリングするにはどうすればよいですか? Eclipseで列挙型に定数をリファクタリングする方法は?

私は日食に組み込みの機能は見つかりませんでした。 http://code.google.com/p/constants-to-enum-eclipse-plugin/http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-menu-refactor.htm

が、私はプラグインを発見しました。私はプラグインが行く方法であるか、誰かがより良いアプローチを使用するかどうか疑問に思っています。

私は常に自分自身が2012年に面倒である定数を貼り付け&カット別のIDEに私を指していないしてください列挙型クラスを作成することができ、私は変更あまりに古すぎるよ悪い習慣;-)

+0

+1、私は他のIDEはどちらか、この機能を持っていることを確認していません。 –

+0

そのような場合、regex replaceは良い(見て)解決策です。 –

+0

これらの定数、クラスレベルまたはプロジェクトレベルはありますか? –

答えて

3

ここでは、このリファクタリングを行うための一連の自動化され手動の手順があります。

ステップ1をカプセル化フィールド定数

ステップ2(オプション)上の定数の名前を変更します。名前を再利用する場合は、これを行います。

ステップ3(手動)定数の値を使用して列挙型を作成します。 enumに、定数を返すgetValueメソッドを与えます。

ステップ4(マニュアル)getterの戻り値をenumのgetValueに置き換えます。

ステップ5ゲッターをインライン化します。 「すべての参照」と「メソッドの削除の宣言」を選択します。

ステップ6定数をインライン化します。 「すべての参照」および「定数宣言の削除」を選択します。

必要に応じて6回後に停止することはできますが、列挙型のパワーを使用するにはさらに処理が必要です。

ステップ7 enum.getValue()をパラメータとして使用する各メソッドについて、定数を置き換えてenumに渡しました。

ステップ7aメソッドを変更して、Enumをパラメータとして追加します。

ステップ7b(手動)getValue呼び出しの横に新しいパラメータとしてenumインスタンスを渡します。すべてのインスタンスが見つかったことを確認するか、後で問題が発生する可能性があります。

手順7c(手動)この方法では、定数の代わりに新しいenumパラメータを使用します。手順7bで通話が切れた場合、ここでテストは失敗します。

ステップ7dメソッドを変更して、古いConstantを削除します。

ステップ8(マニュアル)ブール論理でenum.getValue()を使用するたびに、代わりにenumを使用できるかどうかを判断します。

ステップ9 getValueメソッドが使用されなくなった場合、削除することができます。

ステップ9A(マニュアル)を削除し、未使用のgetValueメソッド

ステップ9B(マニュアル)コンストラクタのフィールドおよび割り当てを削除します。

ステップ9cメソッドの変更enumコンストラクタから値を削除します。

ステップ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

public static String getConstant1() { 
    return AnEnum.CONSTANT1.getValue(); 
} 

public static String getConstant2() { 
    return AnEnum.CONSTANT2.getValue(); 
} 

ステップ5インラインが一定ゲッター

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の変更方法Signiture定数ゲッター

に戻り値を置き換えます列挙型をパラメータとして追加します。

public void method(String aConstant, AnEnum theEnum) 
    .... 
    public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1.getValue(), null); 
} 

のgetValueコール

public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1.getValue(), AnEnum.CONSTANT1); 
} 

ステップ会社7cは、新たな列挙パラメータの代わりに、古い渡された値と一緒に新しいパラメータとして列挙型のインスタンスを渡し7bはステップ。

 if(theEnum.getValue().equals(AnEnum.CONSTANT2.getValue())) 
    { 

ステップは、あなたの代わりに列挙型を使用することができるかどうかを判断ブール論理でenum.getValue()を使用するたびに古い定数

public void method(AnEnum theEnum) 
.... 

public void anotherMethod() 
{ 
    method(AnEnum.CONSTANT1); 
} 

ステップ8を削除するメソッドシグネチャを変更し7dは。

 if(theEnum.equals(AnEnum.CONSTANT2)) 
    { 
     //do something 
    } 

ステップ9aは ステップ9B(マニュアル)コンストラクタのフィールドおよび割り当てを削除し、未使用のgetValueメソッドを削除します。 ステップ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); 
} 

} 
2

リファクタリングは決して「外部の振る舞い」を変えません!例えば

:あなたはNAME1(列挙型)に_NAME1をリファクタリングした場合

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

、コードはmのインスタンス化にクラッシュします。リファクタリングが成功することはありません!

+0

申し訳ありませんが、なぜenumsへのリファクタリングが決して日食の一部ではないかと思います。 –

+0

フィールドの名前を変更したり、名前を変更する方法などがこの種の衝突を引き起こす可能性があり、Eclipseはそれをサポートします。 – artbristol

+0

クラスのプライベート定数を列挙型クラスに抽出します(潜在的に非公開にする)。あなたの答えに感謝します。 – remipod

関連する問題