我希望能够在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中是否有自动重构,如果是这样的话:我该如何应用它?
答案 0 :(得分:26)
在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;
}
}
答案 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身体来调用它。