Java Eclipse中的方法重构

Java Eclipse中的方法重构,java,eclipse,ide,refactoring,eclipse-jdt,Java,Eclipse,Ide,Refactoring,Eclipse Jdt,我尝试在EclipseIDE(JDT)中执行以下重构步骤,但找不到所需的重构,也记不起所有步骤的名称。我在上检查了重构,但没有找到正确的重构 让我们以以下场景为例: A类{ 方法(B){ doSomethingWithA(); b、 doSomethingWithB(); } [...] } B类{ [...] } 1) 使方法成为静态的(缺少重构的名称?): A类{ 静态法(A、B){ a、 doSomethingWithA(); b、 doSomethingWithB(); } [...

我尝试在EclipseIDE(JDT)中执行以下重构步骤,但找不到所需的重构,也记不起所有步骤的名称。我在上检查了重构,但没有找到正确的重构

让我们以以下场景为例:

A类{
方法(B){
doSomethingWithA();
b、 doSomethingWithB();
}
[...]
}
B类{
[...]
}

1) 使方法成为静态的(缺少重构的名称?):

A类{
静态法(A、B){
a、 doSomethingWithA();
b、 doSomethingWithB();
}
[...]
}
B类{
[...]
}

2) 移动方法:

A类{
[...]
}
B类{
静态法(A、B){
a、 doSomethingWithA();
b、 doSomethingWithB();
}
[...]
}

3) 转换为实例方法:

A类{
[...]
}
B类{
方法(A){
a、 doSomethingWithA();
doSomethingWithB();
}
[...]
}


因此,任何知道如何在Eclipse中一步一步地完成这项工作或知道重构名称的人都是受欢迎的。我们的目标是让IDE支持每一步。

不幸的是,Eclipse的重构功能并不像其他IDE(例如Jetbrains')那样完整。我将介绍如何使用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();
    }
    
    public static void method(A a, B b) {
        a.doSomethingWithA();
        b.doSomethingWithB();
    }
    

    1.2

    结果

    public static void method(A a, B b) {
        a.method(b);
    }
    
    public void method(B b){
        doSomethingWithA();
        b.doSomethingWithB();
    }
    
    public static void method(A a, B b) {
        a.doSomethingWithA();
        b.doSomethingWithB();
    }
    

  • 转换为实例方法:现在,这就是它变得棘手的地方。如果您想从第1步转到第3步,您可以使用Eclipse,它可以完美地处理所有事情。然而,据我所知,没有办法使用Eclipse的自动重构从第2步转到第3步

  • 在了解了重构被称为“Convert to Instance Method”之后,我搜索了Eclipse JDT的bug数据库,发现了坏消息:

    因此,基本上这是一个不会修复noone Care特性的请求,所以我可能也该切换到IntelliJ了。我得好好考虑一下

    Emond Papegaij在讨论Bug 118032时提出了一个解决方案:

    一个简单的解决方法是创建静态方法,从要变为静态的方法调用此静态方法,并内联方法调用。这在4.3.1中对我有效


    这很有趣,但也不是一个自动的重构,而且从一开始就违背了重构的目的。添加某人自己的代码会带来失败的可能性,并且需要重新运行测试套件,从而不可能安全地重构遗留代码。

    正是按照我所希望的方式工作的。提示一下,最终产品将有一个额外的参数,可以通过
    Refactor->Change Method Signature