2016-10-07 8 views
-1

私は新しいリストが設定されるたびにリストにその内部イテレータをリセットする必要があるクラスを持っている:私のコンストラクタから追加のロジックを含むセッターを使うべきでしょうか?

public class ListElementReceiver implements ElementReceiver { 
    private List<Element> elements; 
    private Iterator<Element> elementIter; 

    public void reset() { 
     elementIter = elements.iterator(); 
    } 

    public void setElements(List<Element> elements) { 
     this.elements = elements; 
     reset(); 
    } 
} 

私は自分の与えられたインタフェースでそれを使用することができますので、それは基本的には、リストのラッパーとその反復子ElementReceiver。私が持っている問題は、このクラスのコンストラクタを構築することです。どちらのアプローチが好ましいですか?

// Approach 1: Duplicate logic, independant of Setter 
public ListElementReceiver() { 
    elements = new List<Element>(); 
    reset(); 
} 

public ListElementReceiver(List<Element> elements) { 
    this.elements = elements; 
    reset(); 
} 

//Approach 2: Make dependant on Setter 
public ListElementReceiver() { 
    setElements(new List<Element>()); 
} 

public ListElementReceiver(List<Element> elements) { 
    setElements(elements); 
} 
+0

あなたが徹底的に検索しましたか?私は、少なくとも1つの質問がこの地面をカバーする別のものの複製としてクローズされているのを見たことは確かです。 –

+0

私はすばやい検索をしましたが、私は彼らが私の質問に答えなかったように感じました。私が見つけたのは、 "私は自分のコンストラクタからセッターを呼び出すべきですか?"というものでしたが、簡単な設定以外のロジックは含まれていませんでした。 –

+0

私は(ほんの数分の検索の中で)きれいな複製を見つけることができません。確かに非常に近いです:http://stackoverflow.com/questions/12533247/java-setters-from-constructors、http://stackoverflow.com/questions/6104262/java-overridable-call-in-constructor –

答えて

5

コンストラクターから、サブクラスによってオーバーライドできるメソッド(セッターを含む)を呼び出さないでください。そのため、サブクラスが完全に構築される前にサブクラス内のコードが実行され、追跡が困難なバグが発生する可能性があります。

それは(彼らは、順番に、任意のoverrideableコードを呼び出しません提供)privateまたはfinalメソッドを呼び出すために、またはfinalクラスのメソッドを呼び出すには大丈夫だが、それはあなたがここに持っているもののようには見えません。

あなたが1つのコンストラクタは、別のを呼び出すことによって、あなたの最初のアプローチとの重複ロジックを避けることができます。

public ListElementReceiver() { 
    this(new ArrayList<>()); 
} 

public ListElementReceiver(List<Element> elements) { 
    this.elements = elements; 
    elementIter = elements.iterator(); 
} 
+0

私はそれについても考えなかった!ちょうど私が必要なもの、ありがとう! –

+0

おそらく、コンストラクタから呼び出さないでください。これらのメソッドは、* Effective Java *や* Java Concurrency in Practice *のような古典的なリファレンスでは "エイリアンメソッド"と呼ばれます。この用語を知ることは、OPがより多くの情報を見つけるのを助けるかもしれない。 –

+0

@AndyTurner - 厳密に言えば、それはおそらく正しい用語です。しかし、それだけで物事を混乱させると思う。文献を見ると、_alienメソッド_という用語はほとんどの場合並行性の議論に関連しており、ここでの問題は並行性_per se_とは関係ありません。 –

関連する問題