我试图通过将一个类分成几个其他类来重新考虑一些代码。 为此,我想将旧类中已存在的一些方法移动到新类。 但是这些方法在很多地方被引用,手动更新引用似乎很烦人。那么有没有办法移动方法以及在eclipse中更新它们的引用?
答案 0 :(得分:8)
我会这样做:
另一本学习如何应用重新分解模式的好书是Working Effectively with Legacy Code
答案 1 :(得分:4)
如果您使用eclipse IDE,那么重构将帮助您。
答案 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(例如Eclipse
或IntelliJ 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中,您可能需要添加参数和/或使方法保持静态,但这是如何执行它的本质。