10

编辑: 我为此重构提交了Eclipse 增强请求。

有没有办法将私有字段从一个类移动到它的助手类?下面的小鸡 UML 显示了我现在正在手动执行的操作。类在重构之前具有对对象的 C1私有field和私有最终引用。Helper

重构之后,to 中的所有引用C1'field被更改为helper.getField()and helper.setfield()

UML 图

class Field {}

class C1 {
   final private Field field;
   final private Helper helper;

   public Field getField() {
      return field;
   }

   public C1() {
      helper = new Helper();
      field = new Field();
   }
}

class Helper {}

class C1Prime {
   final private HelperPrime helper;

   public Field getField() {
      return helper.getField();
   }

   public C1Prime() {
      helper = new HelperPrime();
   }
}

class HelperPrime {
   final private Field field;
   public HelperPrime() {
      field = new Field();
   }
   public Field getField() {
      return field;
   }
}

我已经大量使用了 Eclipse 的重构功能,但我想不出一种自动化的方法。

例如,理想情况下,我会将私有字段/属性/成员从一个类拖到另一个类,并希望 Eclipse 询问我想如何处理未解析的引用。它没有提供任何建议并破坏了所有参考。

我一直在重复的操作是将不属于当前课程的知识和行为分开。我正在将引用某些字段的属性和行为从原始类移到一个新的“帮助器”类中。

我重构的第一步是移动字段。对助手类的引用作为我要重构的类中的一个字段存在。为了 C1在重构过程中不中断,我认为如果 Eclipse 提供生成 getter 和 setterHelper'并更新引用C1以在新类中使用 getter/setter 会很好。

4

6 回答 6

8

好吧,这通常是没有意义的。从语义上讲,这是一个奇怪的操作。如果将该字段移动到一个新的、不相交的类(例如从 String 到 Integer),则引用它的代码将没有新类的实例可用于获取实例字段。

所以只有在特殊情况下才有意义:当字段是静态成员时,或者您将其移动到父类。

对于静态成员,右键单击要移动的字段(变量名),然后单击 Refactor->Move 即可。选择新类型。参考文献会自动更新(自己试试看)

因为当您将其移入/移出父类时,您可以使用 Refactor->Pull Up 或 Push Down,但这不会自动更改您的引用(只有 Push Down 的问题;使用 Pull Up 多态性表明参考仍然很好)。

于 2010-10-04T20:58:59.367 回答
2

问题是,您的字段必须是私有的(我什至不知道为什么存在创建公共非最终字段的能力)。那么你怎么可能从另一个类访问它呢?

如果您不想在重构期间破坏它,我可以给您一个小技巧,我有时会使用它会有所帮助。

创建类时,使其成为现有类的内部类或同一文件中的第二个类。

如果将其设为内部类,则可以先复制方法,然后它们可以引用另一个类中的成员。一旦移植了所有功能,您就可以移动变量。此时不应更新对变量的任何引用,因为无论它在哪个类中,您都以相同的方式访问它。

如果您还要拆分功能,那么在同一个文件中将一个类作为第二个类可能会很好——它允许您一次访问所有内容,而无需在窗口之间移动鼠标。完成后,只需将新类拖到它自己的 java 文件中,重新计算导入,重新格式化使其公开并保存。

在创建与现有类交互的新类时,我几乎总是使用其中一种方法。

于 2010-10-04T21:15:32.733 回答
1

不会right click the field > Refactoring > Move吗?

是的,它不会更新引用,但想象一下它必须做什么 - 在您的字段被引用的所有地方,它都必须实例化新类。这不切实际。

于 2010-10-04T20:46:45.500 回答
1

字段上的移动操作将无法正常工作。您可以移动一个字段,但 Eclipse 不会移动 getter 和 setter。这是一个有趣的问题,如果这可能,我认为不可能。

于 2010-10-04T20:49:09.200 回答
0

对于 Java 函数,您只需右键单击其名称,然后选择Refactor > Move. 在向导中,选择现在将管理此方法的新类。

我认为这可以帮助你完成任务,即使你不能一次选择几个必须移动的元素......

于 2010-10-04T20:46:24.450 回答
0

如果目标类尚不存在,您可以使用Refactor > Extract Class. 这将创建一个包含您选择的字段的新类,并将此类型的字段添加到您的原始类中。

我不确定您是否可以为确实存在的类执行此操作 - 但您始终可以使用提取类,然后将其内容剪切并粘贴到您的新类中。

于 2010-10-04T20:53:52.987 回答