4

『Java Concurrency in Practice』の中で、Brian Goetzは、クラスのコンストラクターとメソッドに渡されるオブジェクトは、クラス自体によって所有されていないと述べています。それは彼らが外から来ており、クラスが彼らをコントロールできないからですか?

彼はさらに、渡されたオブジェクトの所有権を譲渡するようにメソッドが明示的に設計されている場合(同期コレクションラッパーファクトリメソッドなど)、これには例外があると述べています。誰かが同じ例を挙げて、これを例外と見なす方法を説明できますか?

4

2 に答える 2

4

例外は

List<String> syncList = Collections.synchronizedList(new ArrayList<>());

ラッパーオブジェクトが基になる配列リストへの唯一の到達可能な参照を保持している限り、synchronizedListの設計方法がスレッドセーフの責任を負うことがわかります。

于 2012-07-05T09:19:46.143 に答える
0

この意味での所有は、一般に、オブジェクトによって取得されたリソースをクリーンアップする責任がある人、つまり呼び出しCloseDisposeまたは他のそのようなメソッドに関係します。

メソッドが使用するオブジェクト(ファクトリメソッドなど)を返す場合、このオブジェクトが使用できなくなるため、返される前にこのオブジェクトを閉じることは意味がありません。したがって、所有権が譲渡され、呼び出し元のコードの責任になります。そうじする。

場合によっては、所有権を呼び出されたコードに譲渡することが理にかなっています。新しいオブジェクトの使用法が、その基礎となるメカニズムにとらわれない場合がよくあります。たとえば、文字列を読み取ることができるクラスのインターフェイスがある場合、文字列の読み取り元(ファイルストリーム、ネットワークストリーム、メモリ内など)に応じて、実装をさまざまな方法で使用することは期待できません。したがって、実装でStreamのインスタンスが必要な場合は、Streamの所有権を、Streamを作成したクラスではなく文字列リーダーの実装に渡すのが賢明です。

于 2012-07-05T09:22:43.197 に答える