2011-03-10 1365 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的主体来调用它。