Eclipse中的方法重构

时间:2015-09-28 13:02:23

标签: java eclipse ide refactoring eclipse-jdt

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

我们以下面的场景为例:

class A {

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

    [...]
}

class B {
    [...]
}


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

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支持。

2 个答案:

答案 0 :(得分:2)

不幸的是,Eclipse的重构功能并不像其他IDE那样完整(例如Jetbrains' IntelliJ)。我将包含有关如何执行IntelliJ和Eclipse所请求的每个重构的说明。

使用IntelliJ

  1. Make Method Static
  2. Move Instance Method
  3. Convert to Instance Method
  4. 使用Eclipse

    1. Make Method Static:Eclipse并不直接支持它,但我们可以使用其他两个重构来实现这一点。

      1.1。 Introduce Indirection

      Eclipse's Introduce Indirection refactoring

      <强>结果

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

      1.2。 Inline

      Eclipse's Inline refactoring

      <强>结果

      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步。

答案 1 :(得分:0)

在学习了重构之后被称为'转换为实例方法'我搜索了Eclipse JDT的bug数据库,我发现了坏消息:

Bug 10605 Bug 118032 Bug 338449

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

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

  

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

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