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

Jef*_*rod 10 java eclipse refactoring automated-refactoring

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

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

重构后,所有引用C1'field被改为helper.getField()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;
   }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用了Eclipse的重构功能,但我无法想出一种自动化的方法.

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

我一直在重复的操作是分离当前不属于当前类的知识和行为.我正在将引用原始类中某些字段的属性和行为移动到一个新的"帮助器"类中.

我的重构的第一步是移动字段.对辅助类的引用作为我正在重构的类中的字段而存在.为了C1在重构期间不破坏 ,我认为如果Eclipse提供生成getter和setter Helper'并更新引用C1以使用新类中的getters/setter 将会很好.

Mar*_*ers 8

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

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

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

当您将它移动到父类或从父类移动时,您可以使用Refactor-> Pull Up或Push Down,但这不会自动更改您的引用(仅限下推问题;使用Pull Up多态性指示参考文献都很好).


Bil*_*l K 2

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

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

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

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

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

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