作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经理解了脆弱的基类问题,并且我知道我们可以使用组合优于继承或在父类(super class)中声明私有(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 并放置两个私有(private)辅助方法,它们将由公共(public)方法 inc1 和 inc2 调用
public class A {
protected int i;
public void inc1(){
inc1Helper();
}
public void inc2(){
inc2Helper();
}
private void inc1Helper(){
i++;
}
private void inc2Helper(){
inc1Helper();
}
}
在我的编译器中一切正常,我问自己这是否是使用辅助方法解决脆弱基类的最佳解决方案。感谢您的关注。
最佳答案
“最佳”是一种意见。
在我看来,更好的答案是在 inc2()
上留下 Javadoc 注释,说明它调用 inc1()
。
/** Increments <code>i</code> by calling <code>inc1()</code> */
public void inc2()
...
然后任何扩展 A
的人都可以在文档中看到这一点。如果他们错过了,那么当他们查看堆栈跟踪以查找堆栈溢出异常时就会知道。
这种方式仍然需要文件中的几行,但不需要更多实际的功能逻辑代码行,也不需要更多生成的字节代码。您提到的维基百科文章建议(对于 Java,尽管如此)文档作为答案之一。
关于java - 如何用辅助方法解决脆弱的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42700541/
我是一名优秀的程序员,十分优秀!