2011-03-10 90 views
19

我希望能夠在IntelliJ IDEA中將實例方法從一個類移到另一個類(Fowler的「重構」中的「移動方法」)。不幸的是,當我嘗試「移動...」(cmd:F6)時,它告訴我「沒有任何引用類型的方法,您想使方法靜態然後移動嗎?」我不想讓我的方法是靜態的,我希望它是另一個類中的實例方法。如何使用IntelliJ IDEA重構「移動方法」?

我的代碼示例:

public class TheClass { 

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

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

public class OtherClass { 

} 

說我想從TheClass移動theMethodOtherClass。 IDEA中是否存在自動重構,如果是這樣的話:我如何應用它?

回答

8

IDEA中的Move Method重構只考慮將該方法移動到與其相關的類中,即用作其參數或返回值,或者從方法內部調用。這很有道理:如果該方法與目標類沒有任何具體關係,爲什麼它應該在那裏? OTOH我發現這種限制在某些情況下,我仍然有一個合理的理由來移動該方法。所以我必須手工完成。

8

在的IntelliJ 13.1(不要」知道以前的版本),它可以與

選擇重構完成|提取|在主菜單上的代表

但有一個「奇怪」的限制,顯然:它只能用一個新創建的類來完成。 因此,您必須在不創建「OtherClass」的情況下應用此重構(它將在應用重構時直接創建)。

所以方法上alredy創建的類真正的「舉動」似乎不見了,挺奇怪的行爲調查

20

在14-15的IntelliJ做到以下幾點:

  1. 位置上theMethod插入符號()。
  2. 按下Ctrl/Cmd + F6(更改簽名)。
  3. 引入新參數:種類= TheOtherClass,名稱= theOtherClass,缺省值=新TheOtherClass()
  4. 重構
  5. 然後按F6(移動)和移動方法theOtherClass。

您將結束:

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

正是我在找的東西。謝謝! – 2015-11-24 17:00:16

+1

同樣在這裏。這應該是被接受的答案。或者更像IntelliJ應該把他的狗屎放在一起,所以用戶不需要這樣欺騙;) – 2016-04-12 09:16:26

+0

如果在引入新參數時使用_Use Any Var_,IntelliJ將搜索已引入類的現有實例,並使用那個而不是創建一個新的。強大,但也很危險,所以...要小心。 – Maarten 2016-09-30 07:48:44

0

如果theMethod()有什麼參考主機類(theClass描述),你可以使用此法靜態,然後使用「移動」命令。將該方法移至目標類後,應該刪除static關鍵字。

0

還有另一種方法。想象一下你有這樣的代碼:

public int field; 

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

而且你想使foo成爲靜態。選擇該方法的整個主體,並選擇Alt + Ctrl + M(提取方法)。輸入方法的相同名稱。選中「聲明靜態」複選框(僅當方法只讀取且不修改字段時可用),然後按確定。所以你得到:

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

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

將靜態方法移動到任何你想要的地方,然後用舊的foo的主體來調用它。