当两个类完全没有关联时,如何将方法从类移动到另一个类

时间:2013-11-15 06:39:19

标签: java eclipse refactoring automated-refactoring decomposition

我试图通过将一个类分成几个其他类来重新考虑一些代码。 为此,我想将旧类中已存在的一些方法移动到新类。 但是这些方法在很多地方被引用,手动更新引用似乎很烦人。那么有没有办法移动方法以及在eclipse中更新它们的引用?

6 个答案:

答案 0 :(得分:8)

我会这样做:

  1. 确保您的测试正常运行并且需要重新考虑要重新考虑的代码。如果你没有测试写测试。它们是你的安全绳。
  2. 使用重新分解模式提取超类来创建要将某些方法移动到的新类。
  3. 使用重新分解模式上拉方法将方法及其所需的变量移动到超类。现在,您将看到要移动的方法和实例变量是否与您不想移动的其他方法有依赖关系。如果是这样,你必须首先打破这种依赖关系。
  4. 查找应使用新提取的类而不是“旧”类的所有客户端代码,并将其重写为新提取的类。
  5. 删除两个类之间的“extends”关系。现在客户端代码应该工作或者你错过了什么。
  6. 另一本学习如何应用重新分解模式的好书是Working Effectively with Legacy Code

答案 1 :(得分:4)

如果您使用eclipse IDE,那么重构将帮助您。

enter image description here

答案 2 :(得分:3)

我将向您展示我遵循的流程。 考虑这样的代码:

public class GodClass {
    public someInstanceMethodToMove() {
         // some code 1
    }

    public static someStaticMethodToMove() {
         // some code 2
    }

    public static void main(String[] args) {
        GodClass c = ...;
        c.someInstanceMethodToMove();
        GodClass.someStaticMethodToMove();
    }
}

创建新类:

public class SingleResponsibilityClass {
}

可以使用Eclipse的SingleResponsibilityClass>将静态方法直接移动到Refactor。 Prabhakaran所描述的Move...重构:

public class GodClass {
    public someInstanceMethodToMove() {
         // some code 1
    }

    public static void main(String[] args) {
        GodClass c = ...;
        c.someInstanceMethodToMove();
        SingleResponsibilityClass.someStaticMethodToMove();
    }
}

public class SingleResponsibilityClass {
    public static someStaticMethodToMove() {
         // some code 2
    }
}

对于实例方法,该过程稍微复杂一些。请阅读以下内容。

someInstanceMethodToMove()中提取方法,并将其命名为someInstanceMethodToMove2()

public class GodClass {
    public someInstanceMethodToMove() {
        someInstanceMethodToMove2();
    }

    private someInstanceMethodToMove2() {
         // some code 1
    }

    // ...
}

在原始方法中使用SingleResponsibilityClass

public class GodClass {
    public someInstanceMethodToMove() {
        someInstanceMethodToMove2(new SingleResponsibilityClass());
    }

    private someInstanceMethodToMove2(SingleResponsibilityClass obj) {
         // some code 1
    }

    // ...
}

注意:SingleResponsibilityClass是要移动的实例方法的参数很重要,否则Eclipse不会将其移动到此类型。 在那里,右键点击someInstanceMethodToMove2(),然后选择Refactor> Move...,在向导中选择SingleResponsibilityClass类型,然后应用:

public class GodClass {
    public someInstanceMethodToMove() {
        new SingleResponsibilityClass().someInstanceMethodToMove2();
    }

    // ...
}

public class SingleResponsibilityClass {
    private someInstanceMethodToMove2() {
         // some code 1
    }

    public static someStaticMethodToMove() {
         // some code 2
    }
}

然后右键点击SingleResponsibilityClass'someInstanceMethodToMove2()方法和Refactor> Rename someInstanceMethodToMove() // ... } public class SingleResponsibilityClass { private someInstanceMethodToMove() { // some code 1 } public static someStaticMethodToMove() { // some code 2 } } :     公共课GodClass {         public someInstanceMethodToMove(){             new SingleResponsibilityClass()。someInstanceMethodToMove();         }

GodClass

然后右键点击someInstanceMethodToMove()'Refactor方法和Inline> public class GodClass { public static void main(String[] args) { GodClass c = ...; new SingleResponsibilityClass().someInstanceMethodToMove(); SingleResponsibilityClass.someStaticMethodToMove(); } } public class SingleResponsibilityClass { private someInstanceMethodToMove() { // some code 1 } public static someStaticMethodToMove() { // some code 2 } }

{{1}}

答案 3 :(得分:1)

如果您使用任何标准IDE(例如EclipseIntelliJ IDEA),它们都有一个简单的菜单选项(取决于代码的组织方式)。

如果您转到每个方法并右键单击其名称,则菜单会显示“重构”选项,从而导致“移动”选项。选择它并按照说明操作。

以上对于静态方法尤其容易。对于非静态的,您可能需要进行子类化,或者将引用传递给相应的对象。即便如此,“Refactor - > Move”选项也是一个良好的开端。

答案 4 :(得分:1)

你有任何满意吗

package com.hussi.stackOverFlow;
class ClassOne {

    public void methodInClassOne(String stringParam)
    {
        ClassTwo classTwoObj = new ClassTwo();
        classTwoObj.methodInClassTwo(stringParam);
    }

}


class ClassTwo {

    public void methodInClassTwo(String stringParam)
    {
        System.out.println(stringParam);
    }

}


public class ClassThree {

    public static void main(String[] args) 
    {
        ClassOne objClassOne = new ClassOne();
        // calling method of class two in class one
        objClassOne.methodInClassOne("pass this String value");

    }

}

答案 5 :(得分:1)

  1. 将方法复制到新班级。
  2. 通过调用新类替换旧类中的方法体。
  3. 内联旧方法。
  4. 这就是你所需要的一切。它可能不那么简单,因为在步骤1和步骤2中,您可能需要添加参数和/或使方法保持静态,但这是如何执行它的本质。