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
}
}