如何使用辅助方法解决脆弱的基类

时间:2017-03-09 16:28:55

标签: java helper

我已经理解了脆弱的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();
  }
}

在我的编译器中一切正常,我问自己这是否是使用辅助方法解决脆弱基类的最佳解决方案。谢谢你的关注。

1 个答案:

答案 0 :(得分:1)

“最佳”是一种观点。

在我看来,更好的答案是在inc2()上留下Javadoc评论,说明它调用了inc1()

/** Increments <code>i</code> by calling <code>inc1()</code> */
public void inc2()
...

然后任何扩展A的人都可以在文档中看到它。如果他们错过了,那么他们就会知道他们何时查看堆栈跟踪是否存在堆栈溢出异常。

这种方式仍然需要文件中的几行,但不需要更多的实际功能逻辑代码行,也不再需要生成字节代码。您提到的维基百科文章(以及Java,但仍然是)文档作为答案之一。