编辑:我提交了Eclipse enhancement request for this refactoring。
有没有办法将私有字段从一个类移动到其辅助类?下面的鸡刮UML显示了我现在手动做的事情。在重构之前,类C1
具有私有field
和对Helper
对象的私有最终引用。
重构后,C1'
到field
的所有引用都会根据需要更改为helper.getField()
和helper.setfield()
。
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 /将会很好新课程中的新人。
答案 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然后将其内容剪切到你的新课程中。