【问题标题】:Method refactoring in EclipseEclipse 中的方法重构
【发布时间】:2015-09-28 13:02:22
【问题描述】:

我尝试在 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 支持。

【问题讨论】:

    标签: java eclipse ide refactoring eclipse-jdt


    【解决方案1】:

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

    使用 IntelliJ

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

    使用 Eclipse

    1. Make Method Static: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 步。

    【讨论】:

    • 完全按照我的意愿工作。提示,最终产品将有一个额外的参数,可以使用Refactor -> Change Method Signature 轻松修复
    【解决方案2】:

    得知重构称为“转换为实例方法”后,我搜索了 Eclipse JDT 的错误数据库,发现了一个坏消息:

    Bug 10605 Bug 118032 Bug 338449

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

    Emond Papegaaij 在对 Bug 118032 的讨论中建议解决方法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多