11

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

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 を教えないでください。

4

2 に答える 2

3

このリファクタリングを行うための一連の自動および手動の手順を次に示します。

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

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

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

ステップ 4 (手動) getter の戻り値を列挙型の getValue に置き換えます。

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

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

必要に応じて 6 で停止することもできますが、列挙型の機能を使用するには、さらに多くのことを行う必要があります。

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

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

ステップ 7b (手動) 列挙型インスタンスを新しいパラメーターとして getValue 呼び出しと共に渡します。すべてのインスタンスが見つかっていることを確認してください。そうしないと、後で問題が発生します。

ステップ 7c (手動) メソッドで、定数の代わりに新しい enum パラメータを使用します。ステップ 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 定数ゲッターの戻り値を置き換えます

    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 メソッド シグネチャを変更して、enum をパラメーターとして追加します。

    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 古い渡された値の代わりに新しい enum パラメータを使用します。

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

ステップ 7d メソッド シグネチャを変更して古い定数を削除する

public void method(AnEnum theEnum)
....

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

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

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

(enum) にリファクタリング_NAME1すると、 のインスタンス化でコードがクラッシュします。リファクタリングは決して成功しません!NAME1m

于 2012-11-06T11:26:16.207 に答える