我希望能够在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 {
}
说我想将theMethod
从TheClass
移动到OtherClass
。在IDEA中是否有自动重构,如果是这样的话:我该如何应用它?
IDEA中的Move方法重构仅考虑将方法移动到与其相关的类中,即用作其参数或返回值,或从方法内部调用。这有点合乎逻辑:如果方法与目标类没有任何关系,为什么它应该存在呢? OTOH我在某些情况下发现了这种限制,我仍然有理由移动该方法。所以我不得不手工完成。
在IntelliJ 14-15中,执行以下操作:
你最终会得到:
public class TheClass {
public void doStuff() {
int i = new TheOtherClass().theMethod();
}
}
public class TheOtherClass {
int theMethod() {
System.out.println("Hello World!");
return 0;
}
}
在intellij 13.1中(不知道在之前的版本中)它可以用
选择Refactor |提取|在主菜单上委派
但显然有一个“奇怪的”限制:它只能通过一个新创建的类来完成。因此,您必须在不创建“OtherClass”的情况下应用此重构(它将在您应用重构时直接创建)。
因此,对已经创建的类的方法的真正“移动”似乎缺失,这是非常奇怪的行为
如果theMethod()没有引用宿主类(TheClass),则可以将此方法设为静态,然后使用“移动”命令。将方法移动到目标类后,应删除static关键字。
还有另一种方法。想象一下你有代码:
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的主体来调用它。