2017-03-09 14 views
0

脆弱な基底クラスの問題を理解しており、継承上の合成またはスーパークラスでのプライベートメソッドの宣言を使用して解くことができます。 今、ヘルパーメソッドを使ってこの問題を解決する方法を理解しようとしています。そのため、脆弱な基本クラスの古典的なコードを入れて、ヘルパーメソッドを使って解決します。ヘルパーメソッドで脆弱な基底クラスを解決するには

これは(ウィキペディアより)壊れやすい基本クラスのコード

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

によって呼び出される2つのプライベートヘルパーメソッドを入れています
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のコメントを残すことです。

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

Aを拡張している人は、そのドキュメントでそれを見ることができます。彼らがそれを見逃した場合、彼らは彼らがスタックオーバーフロー例外のためにスタックトレースを見るときを知るでしょう。

このようにしても、ファイル内には数行は必要ですが、機能上の論理コードの行は必要なくなり、生成されるバイトコードは必要ありません。あなたが言及した非常にWikipediaの記事は、解答の1つとして(そしてJavaにもかかわらず)ドキュメンテーションを示唆しています。

関連する問題