如何使用IntelliJ IDEA应用“移动方法”重构?

时间:2011-03-10 16:38:08

标签: refactoring intellij-idea

我希望能够在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中是否有自动重构,如果是这样的话:我该如何应用它?

5 个答案:

答案 0 :(得分:26)

在IntelliJ 14-15中,执行以下操作:

  1. 将插入符号放在方法()上。
  2. 按Ctrl / Cmd + F6(更改签名)。
  3. 介绍新参数:Type = TheOtherClass,Name = theOtherClass,默认值= new TheOtherClass()
  4. 重构
  5. 然后按F6(移动)并将方法移动到其他类。
  6. 你最终会得到:

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

答案 1 :(得分:8)

在intellij 13.1中(不知道以前的版本)可以用

完成

选择重构|提取|在主菜单上委派

但显然有一个“奇怪的”限制:它只能用新创建的类来完成。 因此,您必须在不创建“OtherClass”的情况下应用此重构(在应用重构时将直接创建)。

因此,对alredy创建的类的方法的真正“移动”似乎缺失,非常奇怪的行为

答案 2 :(得分:7)

IDEA中的Move方法重构仅考虑将方法移动到与其相关的类中,即用作其参数或返回值,或从方法内部调用。这有点合乎逻辑:如果方法与目标类没有任何关系,为什么它应该存在呢? OTOH我在某些情况下发现了这种限制,我仍然有理由移动该方法。所以我必须手工完成。

答案 3 :(得分:1)

如果theMethod()没有引用主机类(TheClass),则可以使此方法静态,然后使用“移动”命令。将方法移动到目标类后,应删除static关键字。

答案 4 :(得分:0)

还有另一种方法。想象一下,你有代码:

public int field;

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

你想让foo变得静止。选择方法的整个主体,然后选择Alt + Ctrl + M(Extract方法)。键入方法的相同名称。检查"声明静态"复选框(仅在方法只读取并且不修改字段时可用)并按确定。所以你得到:

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

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

在任何地方移动静态方法,并使用旧的foo身体来调用它。