からセッションに 1 つの配列リストをservlet
アタッチしarraylist
ましservlet
た。
理由を教えてください??
あなたの質問はスタック オーバーフローにとってあまり適切な形ではありませんが、あなたの言いたいことは理解できたと思います。
だからあなたは持っています
List<MyClass> myList = new ArrayList<MyClass>();
コードのどこかで、あなたは
.clear()
。右?
問題は、あなたの考えとは反対に、インスタンスが1 つしかないことです。 ArrayList
「セッション内」にあることと「サーブレット内」にあることは同じです。それを指している別の参照があるということだけ...
必要なことは、リスト インスタンスの別のインスタンスをセッションにアタッチすることです。
//this creates a new list instance, with references to the same objects
List<MyClass> myNewList = new ArrayList<MyClass>(myList);
myNewList
そして、これをセッションに「添付」します。このようにして、結果の 2 つのリストを異なる方法で処理でき、異なる内容を持つことができます。一方を変更すると、もう一方は変更されません。
ただし、構造を再考することをお勧めします。共有情報は常に慎重に対処する必要がある問題です。Java Concurrency In Practiceは、この種の問題に対処する際に読むべき重要な本です。
明らかに、セッションでArrayListを設定した後、引き続きarraylistを使用して編集します。
ただし、セッションで設定したのは、実際の配列リストへの単なるメモリ参照であることに注意してください。両方の変数がメモリ内の同じリストを指しているため、行った変更は引き続き影響します。
あなたができることを避けるために
1)セッションで配列リストを設定した後、無意識のうちにそれを使い続けないように、変数にnullを割り当てます。
ArrayList list = new ArrayList ();
session.setAttribute("list",list);
list = null ; // Assigning the variable to null
セッションで配列コレクションへの参照を追加しているため、明らかにセッションからも明らかになります。したがって、セッション内の配列リスト オブジェクトとコード内の配列リスト オブジェクト (リストがセッションに追加された後) の両方が、メモリ内の同じオブジェクトを参照します。そのため、ArrayList オブジェクトをクリアすると、同じオブジェクトを参照するセッションに含まれる基になるオブジェクトもクリアされます。
コードを機能させるためにできることは 1 つあります。ArrayList のクローンを作成し、そのリストをセッションに入れます。次に、オブジェクトでやりたいことを何でもします。セッションに存在するオブジェクトには影響しません。
お役に立てれば。