HttpSessionに同一名でオブジェクトを上書き保存した場合の挙動
こんにちは。ゆうせいです。
HttpSessionにてsetAttributeメソッドを使用し、すでに存在する属性名(キー)に対して新しいオブジェクトを指定した場合の挙動を解説します。
挙動の仕組み
結論から述べますと、以前保存されていたオブジェクトは破棄され、新しく指定したオブジェクトがその名前に紐付けられます。
セッションは、内部的にキーと値を管理するマップ構造(ハッシュテーブルのような仕組み)を持っています。同一のキーに対して新しい値を設定すると、上書きが行われます。
論理的な状態の変化は以下のようになります。
- 設定前:マップ内のキー $K$ に、既存のオブジェクト $V_{old}$ が関連付けられている。
- 設定処理:$setAttribute(K, V_{new})$ が呼び出される。
- 設定後:キー $K$ に関連付けられた値が $V_{new}$ に更新される。$V_{old}$ への参照は失われる。
メリットとデメリット
この上書き機能は、以下の特性を持ちます。
メリット
一時的な状態を管理する際に、古い情報を明示的に削除する手間を省けます。例えば、ユーザーの入力内容を一時的に保持し、更新のたびに最新の情報をセッションへ反映させることが容易になります。
デメリット
古いオブジェクトが保持していた情報は完全に失われます。もし古いオブジェクトがメモリ上のリソースや外部接続を保持していた場合、参照が切り替わることでそれらが適切に解放されない可能性や、直前の状態へ戻すことが困難になるというリスクが伴います。
注意事項:オブジェクトのライフサイクル
注意すべき点として、上書きされた古いオブジェクトが直ちにメモリから削除されるわけではないという点があります。Javaにはガベージコレクションという仕組みがあり、参照されなくなったオブジェクトは、将来的にメモリから自動的に解放されます。しかし、大量のデータを頻繁に上書きし続けるような設計を行うと、ガベージコレクションの頻度が増加し、アプリケーションのパフォーマンスに影響を与える可能性があります。
学習のステップ
この挙動を深く理解するために、以下の手順で学習を進めてください。
- サンプルコードを作成し、setAttributeを同一キーで二回呼び出し、removeAttributeを使用せずに値が更新されることを確認する。
- オブジェクトの入れ替えが発生する際、古いオブジェクトがいつメモリから解放されるのか、Javaのメモリ管理とガベージコレクションの仕組みを整理する。
- データの更新頻度が高い場合、setAttributeの代わりにどのような設計が可能か、設計パターンを調査する。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。

