【问题标题】:How to solve the fragile base class with helper methods如何使用辅助方法解决脆弱的基类
【发布时间】:2017-07-30 17:52:47
【问题描述】:

我已经了解了脆弱的基类问题,并且我知道我们可以使用组合而不是继承或在超类中声明私有方法来解决它。 现在我正在尝试了解如何使用辅助方法解决这个问题,所以我将放置脆弱基类的经典代码,然后我将使用辅助方法放置我的解决方案,如果我做错了请告诉我。

这是一个脆弱基类的代码(来自维基百科)

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();
  }
}

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

【问题讨论】:

    标签: java helper


    【解决方案1】:

    “最佳”是一种意见。

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

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

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

    这种方式仍然需要文件中的几行,但不需要更多实际的功能逻辑代码行,也不需要生成更多的字节码。您提到的那篇 Wikipedia 文章建议(尽管如此,对于 Java)文档作为答案之一。

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2011-05-19
      • 2013-12-06
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多