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

问题描述 投票:22回答:5

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

refactoring intellij-idea
5个回答
7
投票

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


26
投票

在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;
    }
}

8
投票

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

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

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

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


1
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.