3

LinkedListなどの一部のコレクションにオブジェクトを追加すると、要素がコレクションに直接追加されないことを知っています。実際には、リンク機能を提供するノードがコレクションに追加され、このノードには、コレクションに追加したオブジェクトへの参照があります。これはすべてのJavaコレクションクラスに当てはまりますか?たとえば、私が次のことをするとき:

List<String> list = new ArrayList<String>();
list.add("Car");

Stringオブジェクト「Car」がリストに直接追加されますか、それとも「Car」を指すノードだけがリストに追加されますか?

また、これをプロキシデザインパターンと見なすことはできますか?

4

3 に答える 3

5

JavaのArrayListは、配列を使用してオブジェクトへの参照を格納するため、プロキシパターンとは関係ありません。あなたはあなた自身のために、ここにそれのOpenJDK実装へのリンクがあるのを見ることができます。行103には、関連するコードがあります。

private transient Object[] elementData;

また、ノードを使用して次および前の要素への参照をに格納するLinkedListと比較することもできますList

于 2013-01-27T00:05:49.677 に答える
2

LinkedListに要素を追加することは、プロキシパターンではありません。プロキシパターンは作成パターンです。LinkedList内には、含まれている内容に関して作成は行われません。ノードがオブジェクトをラップするという事実は、それをプロキシとして認定するのに十分ではありません。ラッピングノードは、ラッピングノードおよびコレクションに含まれるオブジェクトとの共有インターフェイスも実装していません。

プロキシは、別のオブジェクトの代わりに使用できるオブジェクトであるため、共有インターフェイスが重要です。このスタンドインオブジェクトは、オンデマンドで実際のオブジェクトを作成することにより、メモリ、時間、またはその両方を節約できます。また、必要のないときにオブジェクトを破棄することもできます。プロキシは、プロキシパターンの特徴である、ラップするオブジェクトの存続期間を制御します。コレクション内のノードは、ラップするオブジェクトが与えられたため、それが指すオブジェクトの存続期間を制御しません。

たとえば、多くのデータベースに接続するアプリケーションがありますが、必ずしもすべてのデータベースに一度に接続する必要はありません。接続が要求された場合にのみ基になるデータソースを作成する特別なデータソースを実装できます。また、アクティブな接続がない場合(たとえば、最後に渡された接続が閉じられた場合)、データソースを閉じる可能性があります。

これは、ほとんどの接続プールライブラリで接続プールが実装される方法と似ています。基盤となるデータソースはDBへの接続を提供するだけですが、接続プールはデータソースの上に階層化され、クライアントがその発生を認識せずにプールを提供します。

于 2013-01-27T00:38:05.270 に答える
1

などのソースコードを実際に見ることができます。ArrayList

ArrayListは内部で配列を使用するためObject[]、余分なラッパーは必要ありませんが、オブジェクト参照を直接格納します。したがって、ここには絶対に「プロキシ」はありません。

ただし、プリミティブ型を入力すると、オブジェクトとして自動ボックス化されます。これもプロキシパターンのインスタンスとは呼びません。

プロキシパターンを探す場合は、RMIをご覧ください。

于 2013-01-27T00:18:38.240 に答える