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

mra*_*ers 23 refactoring intellij-idea

我希望能够在IntelliJ IDEA中将实例方法从一个类移动到另一个类(来自Fowler的"重构"中的"Move方法").不幸的是,当我尝试"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 {

}
Run Code Online (Sandbox Code Playgroud)

说我想移动theMethodTheClassOtherClass.在IDEA中是否有自动重构,如果是这样的话:我该如何应用它?

Maa*_*ten 27

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

  1. 将插入符号放在方法()上.
  2. 按Ctrl/Cmd + F6(更改签名).
  3. 引入新参数:Type = TheOtherClass,Name = theOtherClass,Default value = new TheOtherClass()
  4. 重构
  5. 然后按F6(移动)并将方法移动到其他类.

你最终会得到:

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

  • 正是我在寻找什么.谢谢! (2认同)
  • 同样在这里.这应该是公认的答案.或者更像IntelliJ应该把他的狗屎放在一起,这样用户就不必像这样欺骗;) (2认同)
  • @Adam Toth,你不能责怪IntelliJ没有为开发人员提供很多方便的东西imo :) (2认同)

Ant*_*imo 8

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

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

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

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


Pét*_*rök 7

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