Java 当两个类完全不相关时,如何将一个方法从一个类移动到另一个类

Java 当两个类完全不相关时,如何将一个方法从一个类移动到另一个类,java,eclipse,refactoring,automated-refactoring,decomposition,Java,Eclipse,Refactoring,Automated Refactoring,Decomposition,我试图通过将一个类拆分为其他几个类来重新考虑一些代码。 为此,我想将旧类中已经存在的一些方法移动到新类中。 但是这些方法在很多地方被引用,手动更新引用似乎很烦人。那么,有没有办法在eclipse中移动方法以及更新它们的引用呢?如果您使用任何标准IDE(例如,eclipse或IntelliJ IDEA),它们都有一个简单的菜单选项来实现这一点(取决于代码的组织方式) 如果您转到每个方法并右键单击其名称,则菜单中有一个“重构”选项,这将导致一个“移动”选项。选择该选项并按照说明操作 上述方法对于静态

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

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

如果您转到每个方法并右键单击其名称,则菜单中有一个“重构”选项,这将导致一个“移动”选项。选择该选项并按照说明操作


上述方法对于静态方法尤其容易。对于非静态对象,您可能需要进行子类化,或者传递对周围适当对象的引用。即便如此,“重构->移动”选项也是一个良好的开端。

如果您使用eclipse IDE,重构将对您有所帮助


我会这样做:

  • 确保您的测试工作正常,并且涵盖了要重新分解的代码。如果没有测试,请编写测试。它们是你的安全绳
  • 使用重分解模式提取超类创建要将某些方法移动到的新类
  • 使用重分解模式上拉方法将方法及其所需的变量移动到超类中。现在,您将看到您想要移动的方法和实例变量是否与您不想要移动的其他方法有依赖关系。如果是这样,您必须首先打破这种依赖关系
  • 找到所有应该使用新提取类而不是“旧”类的客户端代码,并将其重写为新提取类
  • 删除两个类之间的“扩展”关系。现在客户端代码应该可以工作了,否则您会错过一些东西
    学习如何应用重分解模式的另一本好书是

    这本书让你满意吗

    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");
    
        }
    
    }
    
  • 将该方法复制到新类中
  • 用对新类的调用替换旧类中的方法体
  • 内联旧方法
    这就是你所需要的。它可能没有那么简单,因为在步骤1和2中,您可能需要添加参数和/或使方法成为静态的,但这是如何做到这一点的关键

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

    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的
    Refactor
    Move…
    重构直接移动到
    SingleResponsibilityClass
    ,如Prabhakaran所述:

    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()

    在原始方法中使用
    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()
    方法,然后
    重构
    将其重命名为
    someInstanceMethodToMove()
    : 公务舱{ 公共someInstanceMethodToMove(){ 新的SingleResponsibilityClass().someInstanceMethodToMove(); }

        // ...
    }
    
    public class SingleResponsibilityClass {
        private someInstanceMethodToMove() {
             // some code 1
        }
    
        public static someStaticMethodToMove() {
             // some code 2
        }
    }
    
    然后右键单击
    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
        }
    }
    

    虽然在没有看到代码的情况下很难说出任何事情,但我认为继承应该可以解决您的问题,但我不想继承。一旦创建了新类,我将删除旧类。我将移动引用,然后遍历所有显示错误的文件,并按Ctrl+Shift+O自动组织导入。使用静态方法创建实用程序类ds。因此,您可以在应用程序中的任何位置引用它,而无需创建对象和全部。@Sandhu:这将导致添加代码。我只想添加代码。将一个类拆分为2-3个类,因为类的长度约为2000行。eclipse中没有任何自动更新引用的功能吗“Refactor->Move”,但对我不起作用。它说不存在要移动的目标。我认为b/w类需要一些关系。目标类必须可以从要移动的方法中访问,并且符合许多其他规则(例如,不调用super关键字)。很难猜出您的代码是什么样子的。如果它都在一个类中,请创建目标类,在原始类中声明这些类中的一些伪变量,然后再次尝试重构->移动路径。我尝试了..方法被移动,但引用没有…例如..Class1有方法abc()现在方法已移动,但使用此方法的class3仍将其用作ClassObj.abc(),而不是class2obj.abc()。
    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
        }
    }