Eclipse 中的方法重构

Method refactoring in Eclipse

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

让我们以以下场景为例:

class A {

    method(B b) {
      doSomethingWithA();
      b.doSomethingWithB();
    }

    [...]
}

class B {
    [...]
}


1) Make 方法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

  1. Make Method Static
  2. Move Instance Method
  3. Convert to Instance Method

使用 Eclipse

  1. 使方法静态化:Eclipse 不直接支持它,但我们可以使用其他两个重构来实现。

    1.1。 Introduce Indirection

    结果

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

    1.2。 Inline

    结果

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

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

了解重构后调用'Convert to Instance Method'我搜索了Eclipse JDT的错误数据库,发现了一个坏消息:

Bug 10605 Bug 118032 Bug 338449

所以基本上这是一个 Won't-Fix noone cares 功能请求,所以可能是时候我也切换到 IntelliJ 了。我不得不考虑这个......

Emond Papegaaij 在 Bug 118032 的讨论中提出了解决方法:

A simple workaround is to create the static method, call this static method from the method you want to become static and inline the method call. This works for me in 4.3.1.

这很有趣,但同样不会是自动重构,并且首先会破坏重构的目的。添加某人自己的代码会引入失败的可能性,并且需要重新运行测试套件,从而导致无法安全地重构遗留代码。