2017-03-09 51 views
0

我已經理解了脆弱的Base類問題,並且我知道我們可以使用Composition over Inheritance或者在超類中聲明私有方法來解決它。 現在我想了解如何使用幫助器方法解決這個問題,所以我會把脆弱的基類的經典代碼,然後我會把我的解決方案與幫助器方法,告訴我,如果我做錯了請。如何使用幫助器方法解決脆弱的基類

這是一個脆弱的基類(來自維基百科)

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級,並把兩個私有helper方法將由公共方法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

「最好」是一個意見。

在我看來,更好的答案是留下對inc2()的Javadoc評論,聲明它稱inc1()

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

然後人誰伸出A可以看到文檔。如果他們錯過了,他們會知道他們什麼時候看到堆棧跟蹤的堆棧溢出異常。

這種方式仍然需要文件中的幾行,但不需要更多實際的功能邏輯代碼行,也不需要更多生成的字節代碼。您提到的維基百科文章建議(並且對於Java來說)文檔是其中一個答案。