考虑一个包装类W
,包装C
,这意味着对于C
的大多数属性,A
上有一个对应的属性W
,它的逻辑只包括授权C
的{{1}}。使用下面的草图可以最精确地描述这种情况:
A
麻烦的是,我已经决定我不想摆脱class W {
private C c;
getX() { return c.getX(); }
getY() { return c.getY(); }
}
,而我更愿意将getX()
作为公共场所的一个暂时的步骤,让所有的调用C c
代码执行W
或w.c.getX()
或者创建w.c.getY()
,并拨打W.getC()
和getX()
的所有电话通过它。
这一切归结为“无封装”的重构。在Eclipse或Intellij中是否有任何执行这项急需的任务?
答案 0 :(得分:6)
使用IntelliJ,您可以使用Remove Middleman重构。
考虑:
<强>之前强>:
public class W {
private C c;
Object getX() { return c.getX(); }
Object getY() { return c.getY(); }
}
public class C {
private Object x;
private Object y;
public Object getX() {
return x;
}
public Object getY() {
return y;
}
}
public class UsesW {
W w;
public void useW() {
Object x = w.getX();
Object y = w.getY();
}
}
将光标放在W.c
的声明上。然后选择重构|删除Middleman 。
结果让你到达目的地的一半:
<强>后强>:
public class W {
private C c;
public C getC() {
return c;
}
}
/* class C is unchanged */
public class UsesW {
W w;
public void useW() {
Object x = w.getC().getX();
Object y = w.getC().getY();
}
}
然后,您可以在C
中引入UsesW
类型的变量。将光标放在w.getC()
的其中一个调用上并内联它:重构|内联... (Ctrl-Alt-N
是默认快捷方式),选择内联所有实例。它会让你知道:
public class UsesW {
W w;
public void useW() {
final C c = w.getC();
Object x = c.getX();
Object y = c.getY();
}
}
最后完全摆脱W
是你可能比我更好的答案,但现在这项工作变得更加容易。
答案 1 :(得分:3)
getC()
方法。getX()
重写为return getC().getX()
。getX()
。 y
同样如此。