我尝试在 Eclipse IDE (JDT) 中执行以下重构步骤,但找不到所需的重构,并且无法记住所有步骤的名称。我检查了SourceMacking的重构,但没有找到正确的。
我们以以下场景为例:
class A {
method(B b) {
doSomethingWithA();
b.doSomethingWithB();
}
[...]
}
class B {
[...]
}
1)使方法static(缺少重构的名称?):
class A {
static method(A a, B b) {
a.doSomethingWithA();
b.doSomethingWithB();
}
[...]
}
class B {
[...]
}
2)移动方法:
class A {
[...]
}
class B {
static method(A a, B b) {
a.doSomethingWithA();
b.doSomethingWithB();
}
[...]
}
3) 转换为实例方法:
class A {
[...]
}
class B {
method(A a) {
a.doSomethingWithA();
doSomethingWithB();
}
[...]
}
因此,欢迎任何知道在 Eclipse 中逐步执行此操作或知道重构名称的人。我们的目标是为每一步提供 IDE 支持。
不幸的是,Eclipse 的重构功能并不像其他 IDE 那样完整(例如 Jetbrains 的IntelliJ)。我将提供有关如何使用 IntelliJ 和 Eclipse 执行您请求的每个重构的说明。
使用 IntelliJ
使用 Eclipse
使方法静态:Eclipse 不直接支持它,但我们可以使用其他两个重构来实现这一点。
1.1。 引入间接
结果
public static void method(A a, B b) {
a.method(b);
}
public void method(B b){
doSomethingWithA();
b.doSomethingWithB();
}
1.2。 内联
结果
public static void method(A a, B b) {
a.doSomethingWithA();
b.doSomethingWithB();
}
在了解到重构称为“转换为实例方法”后,我搜索了 Eclipse JDT 的错误数据库,发现了坏消息:
所以基本上这是一个“Won't-Fix”没人关心的功能请求,所以我可能是时候切换到 IntelliJ 了。我必须考虑一下这个问题......
Emond Papegaaij 在 Bug 118032 的讨论中建议了一种解决方法:
一个简单的解决方法是创建静态方法,从要变为静态的方法中调用此静态方法并内联方法调用。这在 4.3.1 中对我有用。
这很有趣,但同样不会是自动重构,并且从一开始就违背了重构的目的。添加某人自己的代码会带来失败的可能性,并且需要重新运行测试套件,从而导致无法安全地重构遗留代码。
使方法静态:Eclipse 不直接支持它,但我们可以使用其他两个重构来实现这一点。
2024:[Eclipse 4.31 确实支持它](https://eclipse.dev/eclipse/news/4.31/jdt.php#new-make-static-refactoring!
新建静态重构
Eclipse 的 Java 开发工具 (JDT) 中添加了名为“Make Static”的新重构,可在可能的情况下将实例方法转换为静态方法。
此重构在方法声明中添加了一个额外的参数,以处理对原始方法中的实例字段、方法或类的引用。
对该方法的现有调用会相应地更改,如果需要额外的参数,则重构会传递“this”或最初用于访问该方法的特定实例。
要应用此重构,必须满足以下条件:
- 该方法不是构造函数。
- 该方法不会重写父类型中的方法,也不会在任何子类型中重写。
- 声明方法的类型不是本地类型、匿名类型或注释。
- 可以通过选择方法调用来执行重构,但选择超级方法调用的情况除外。