web-dev-qa-db-ja.com

IntelliJ IDEAで「moveメソッド」リファクタリングを適用するにはどうすればよいですか?

IntelliJ IDEAでインスタンスメソッドをあるクラスから別のクラスに移動できるようにしたい(Fowlerの「リファクタリング」から「Moveメソッド」)。残念ながら、「移動...」(cmd:F6)を実行すると、「参照型を持つメソッドはありません。メソッドを静的にしてから移動しますか?」と表示されます。メソッドを静的にしたくはありません。代わりに、他のクラスのインスタンスメソッドにしたいのです。

私のコード例:

public class TheClass {

  public void doStuff(){
     int i = themethod();
  }

  private int theMethod() {
    System.out.println( "Hello World!" );
    return 0;
  }
}

public class OtherClass {

}

theMethodTheClassからOtherClassに移動するとします。 IDEAには、このための自動リファクタリングがありますか?ある場合:どのように適用しますか?

25
mranders

IDEAでのMoveメソッドのリファクタリングは、メソッドをそれに関連するクラスに移動することのみを考慮します。つまり、パラメーターまたは戻り値として使用されるか、メソッド内から呼び出されます。これは論理的です。ターゲットクラスとは具体的な関係がないのに、なぜそこにあるのか?OTOHメソッドを移動する正当な理由がある場合に、この制限を見つけたので、手作業で行う必要がありました。

7
Péter Török

IntelliJ 14-15では、以下を実行します。

  1. TheMethod()にキャレットを配置します。
  2. ctrl/Cmd + F6(署名の変更)を押します。
  3. 新しいパラメータを導入します:Type = TheOtherClass、Name = theOtherClass、Default value = new TheOtherClass()
  4. リファクタリング
  5. 次に、F6(移動)を押して、メソッドをOtherClassに移動します。

最終的には次のようになります。

public class TheClass {
    public void doStuff() {
        int i = new TheOtherClass().theMethod();
    }
}
public class TheOtherClass {
    int theMethod() {
        System.out.println("Hello World!");
        return 0;
    }
}
28
Maarten

Intellij 13.1(以前のバージョンではわからない)では、

リファクタリングを選択|抽出|メインメニューの委任

しかし、明らかに「奇妙な」制限があります。それは、新しく作成されたクラスでのみ実行できます。したがって、「OtherClass」を作成せずにこのリファクタリングを適用する必要があります(リファクタリングを適用すると直接作成されます)。

したがって、すでに作成されたクラスのメソッドの実際の「移動」が欠落しているように見え、非常に奇妙な動作になります

8
Antimo

theMethod()にホストクラス(TheClass)への参照がない場合は、このメソッドを静的にするにしてから、「移動」コマンドを使用できます。メソッドをターゲットクラスに移動した後、staticキーワードを削除する必要があります。

1
Danny Liao

別の方法があります。あなたがコードを持っていると想像してください:

public int field;

public void foo(int a) {
    assert field == a;
}

そして、fooを静的にします。メソッド全体を選択し、Alt + Ctrl + M(メソッドの抽出)を設定します。メソッドの同じ名前を入力します。 [静的を宣言する]チェックボックスをオンにして(メソッドがフィールドを読み取り、変更しない場合にのみ使用可能)、[OK]を押します。だからあなたは得る:

public void foo(int a) {
    foo(a, field);
}

private static void foo(int a, int field) {
    assert field == a;
}

静的メソッドを好きな場所に移動し、古いfooの本体を使用して呼び出します。

0
barbalion