重构将私有字段从一个类移动到其辅助类?

时间:2010-10-04 20:42:12

标签: java eclipse refactoring automated-refactoring

编辑:我提交了Eclipse enhancement request for this refactoring

有没有办法将私有字段从一个类移动到其辅助类?下面的鸡刮UML显示了我现在手动做的事情。在重构之前,类C1具有私有field和对Helper对象的私有最终引用。

重构后,C1'field的所有引用都会根据需要更改为helper.getField()helper.setfield()

UML Diagram

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提出在Helper'中生成getter和setter并更新C1中的引用以使用getters /将会很好新课程中的新人。

6 个答案:

答案 0 :(得分:8)

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

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

对于静态成员,右键单击要移动的字段(变量名称),然后单击“重构” - >“移动”。选择新类型。参考文献将自动更新(亲自试一试)

当您将其移至/从父类移动时,您可以使用Refactor-> Pull Up或Push Down,但这不会自动更改您的参考(仅限问题)使用Push Down;使用Pull Up多态性指示引用仍然很好。

答案 1 :(得分:2)

问题是,你的领域必须是私人的(我甚至不知道为什么创建公共非最终领域的能力存在)。那你怎么可能从另一个班级访问它?

如果你不想在重构过程中打破它,我可以给你一个小技巧,我有时会帮助你。

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

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

如果你将功能分开,那么让一个类成为同一个文件中的第二个类可能会很好 - 它可以让你一次访问所有内容而不需要在窗口之间进行混淆。完成后,只需将新类拖入其自己的java文件中,重新计算导入,重新格式化即可将其保存并保存。

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

答案 2 :(得分:1)

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

是的,它不会更新引用,但想象它必须做什么 - 在引用字段的所有位置,它必须实例化新类。这不切实际。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

我不确定你是否可以为一个确实存在的类做这件事 - 但是你总是可以使用Extract Class然后将其内容剪切到你的新课程中。