2016-07-26 4 views
4

私はSynchronizedListクラスを拡張したいと思っていましたが、プライベートであることがわかりました。静的メソッドがプライベートクラスを返すようにするには、設計上の決定の背後にあるのは何ですか? Collections.synchronizedList()など

なぜこのように設計されましたか?

+2

それをデザインした人は、あなたがそれを拡張してほしくないからです。その正確な理由はデザイナーのみが知っていますが、「効果的なJava 2nd Ed * Item 17」のアドバイスを参考にしてください。「継承のための設計と文書化、またはそれを禁止する」誰かがそれを拡張することを心配する必要がなければ、クラスの実装を簡素化します。 –

+2

プラス1枚。 IMHO短い質問は必ずしも貧しいものではありません。 – Bathsheba

+1

どのような動作をクラスに追加しますか?代わりに 'SynchronizedList'でラップされたリストに追加することは可能かもしれません。 –

答えて

3

それをデザインした人は、あなたがそれを伸ばさないようにするためです。

それを行うための正確な理由は唯一のデザイナー(複数可)に知られているが、効果的なJavaの第2版項目17にアドバイスを検討している:

他の設計および文書の継承のためか、それを禁止しています。

拡張する人を気にする必要がなければ、クラスの実装を簡略化します。効果的なJavaアイテムは、あなたが設計しなければならない問題の種類とそれらを緩和するために必要なステップの詳細を多く提供します。

クラスデザイナーの側では、「設計とドキュメントの継承」を行わないことが怠け者だと主張する人がいました。 Collections.Synchronized*クラスの特定のケースでは、私はこれを信じません。クラスデザインは常に妥協です。設計者は、同期コレクションを拡張するための非常に限られた数のユースケースに対して、余計な努力を払うことのメリットを重視していたと思います。 (私はクラスを拡張しようと考えたことは一度もありませんでしたが、確かにサンプルサイズは1ですが)。

これはラッパークラスです。Synchronized*クラスでラップされたクラスに追加の機能を追加するか、Synchronized*クラスをデコレータでラップすることもできます。または、自分でSynchronized*クラスを再実装するだけでもかまいません。それは定型文の束ですが、難しくありません。

どちらを選んでも問題はありません。

+0

あなたの助けに感謝アンディ・ターナー。あなたは私に有効なJava –

関連する問題