我已经理解了脆弱的Base类问题,我知道我们可以使用Composition over Inheritance或在超类中声明private方法来解决它。 现在我正在尝试理解如何使用帮助方法解决这个问题,所以我会把经典的脆弱基类代码放进去,然后我会把我的解决方案用帮助方法,告诉我,如果我做错了请。
这是脆弱基类的代码(来自维基百科)
public class JavaApplicationProvaHello {
public class A {
private int i;
public void inc1(){
i++;
}
public void inc2(){
inc1();
}
}
//---------------------------
public class B extends A{
@Override
public void inc1(){
inc2();
}
}
//------------------------
public class Test{
public static void main(String[] args) {
B b = new B();
b.inc1();
}
}
}
现在我更改了A类并放置了两个私有帮助器方法,这些方法将由公共方法inc1和inc2调用
public class A {
protected int i;
public void inc1(){
inc1Helper();
}
public void inc2(){
inc2Helper();
}
private void inc1Helper(){
i++;
}
private void inc2Helper(){
inc1Helper();
}
}
在我的编译器中一切正常,我问自己这是否是使用辅助方法解决脆弱基类的最佳解决方案。谢谢你的关注。
答案 0 :(得分:1)
“最佳”是一种观点。
在我看来,更好的答案是在inc2()
上留下Javadoc评论,说明它调用了inc1()
。
/** Increments <code>i</code> by calling <code>inc1()</code> */
public void inc2()
...
然后任何扩展A
的人都可以在文档中看到它。如果他们错过了,那么他们就会知道他们何时查看堆栈跟踪是否存在堆栈溢出异常。
这种方式仍然需要文件中的几行,但不需要更多的实际功能逻辑代码行,也不再需要生成字节代码。您提到的维基百科文章(以及Java,但仍然是)文档作为答案之一。