コンストラクターでnew
キーワードを使用することについて このページ を読んでいましたが、コレクションのコピーコンストラクターに適用できるかどうか疑問に思いました。
Book
クラスとset
のauthors
を格納するコレクションがあるとします。
_class Book {
private String title;
private Set<Author> authorsSet;
Book (title, authors){
this.title = title
this.authorsSet = Collections.unmodifiableSet(new HashSet<Author>(authors))
}
}
_
クライアントコードがauthorsSet
の内部を変更できないように、防御コピーを作成することをお勧めします。
this.authorsSet = Collections.unmodifiableSet(new HashSet<Author>(authors))
を呼び出すことは、コンストラクターがnew
キーワードを呼び出すべきではないというガイドラインに違反していますか?その場合、new
キーワードなしで防御コピーを作成するにはどうすればよいですか?
クラスAのコンストラクターで、クラスBの別のオブジェクトがnew
によって構築されている場合、AはBに強く依存しているため、Bから分離されたAをテストできません。これは、Bを挿入することで解決できます。 Bが実装するインターフェイスタイプのコンストラクタパラメータを介してAにインスタンス化します。しかし、それは必要なだけです
示されたケースでは、それはクラスBook
から分離されたHashSet
を単体テストすることを意味します-これはおそらくあなたが望むものでも必要なものでもありません。 HashSet
のようなコレクションクラスは、フレームワークまたはプログラミング言語の要素として扱うことができます(実際、PerlやPython彼らのようないくつかの言語では言語の要素)これらは軽量で高速であり、すべての実用的な目的でバグがないと見なすことができ、多くの場合、ほとんどのコードはそれらに依存しています。したがって、通常、中断することは意味がありません。それらへの依存。