web-dev-qa-db-ja.com

オブジェクトコンストラクターでコピーコンストラクターを使用するのは悪いですか?

コンストラクターでnewキーワードを使用することについて このページ を読んでいましたが、コレクションのコピーコンストラクターに適用できるかどうか疑問に思いました。

Bookクラスとsetauthorsを格納するコレクションがあるとします。

_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キーワードなしで防御コピーを作成するにはどうすればよいですか?

1
user313955

クラスAのコンストラクターで、クラスBの別のオブジェクトがnewによって構築されている場合、AはBに強く依存しているため、Bから分離されたAをテストできません。これは、Bを挿入することで解決できます。 Bが実装するインターフェイスタイプのコンストラクタパラメータを介してAにインスタンス化します。しかし、それは必要なだけです

  • あなたが実際にBから分離されたAを単体テストしたい、または必要がある場合

示されたケースでは、それはクラスBookから分離されたHashSetを単体テストすることを意味します-これはおそらくあなたが望むものでも必要なものでもありません。 HashSetのようなコレクションクラスは、フレームワークまたはプログラミング言語の要素として扱うことができます(実際、PerlやPython彼らのようないくつかの言語では言語の要素)これらは軽量で高速であり、すべての実用的な目的でバグがないと見なすことができ、多くの場合、ほとんどのコードはそれらに依存しています。したがって、通常、中断することは意味がありません。それらへの依存。

5
Doc Brown