Java Beanはデータ管理や再利用を目的として利用される設計ですが、具体的にはどういう内容なのか分からない人もいるのではないでしょうか。Java Bean以外にもSpring Beanもあるので混同してしまう人もいるでしょう。
本記事では、Java Beanの基本構成や特徴、Java Beanの作成方法まで詳しく解説します。Java言語を習いたての初心者でも分かりやすいように実際のコード例も紹介するので、Java Beanを活用した開発をしたい人は必見です。
JavaのBeanとは?
Java Beanとは1997年に登場した技術で、特定のルールに基づいて作成されたデータを管理するためのJavaクラスであり、再利用可能なソフトウェアコンポーネントまたは仕様のことです。つまり、同一のコンポーネント(部品)が異なるアプリケーションでも使用できるということを意味します。
Javaの標準仕様としてサーバーサイドの開発で幅広く活用されているので、バックエンドエンジニアを目指す人は知識として知っておくことをおすすめします。
Java Beanが使われる理由とは
Java Beanが使われる主な理由は、データの管理がシンプルで再利用しやすい点にあります。Java Beanを扱うメリットは次のとおりです。
- カプセル化によるデータ保護
- シリアライズ可能
- 統一された命名規則
- 再利用性が高い
例えば、機密性の高いデータを取り扱う場合、Java Bean形式で情報を管理するクラスを作ることで保守性を保ちながらデータのやり取りが行えます。また、データの取得や設定にはgetter(ゲッター)・setter(セッター)メソッドを使うので外部から安全にデータの操作も可能です。
Java BeanとSpring Beanの違い
Java BeanとSpring Beanは似た名前ですが、正確には役割や用途に違いがあります。
Java Bean | Spring Bean | |
---|---|---|
用途の違い | データの一時保存 データのやりとりが目的 | 依存性注入を使ったコンポーネント管理 |
インスタンス管理方法 | 開発者がインスタンスを手動で生成する | Springコンテナが自動でインスタンスを管理する |
フレームワークの依存 | 特定のフレームワークに依存しない | Springフレームワーク内でのみ使える |
Spring BeanはSpringコンテナが管理するオブジェクトのため、Springフレームワーク内でしか利用はできません。一方でJava Beanは基本的な設計ルールであり、特定のフレームワークに依存しない強みを持っています。
Java Beanの基本構成
Java Beanはただクラスを定義すれば良いわけではなく、一定のルールに従って作成されたオブジェクトのことをいいます。データのカプセル化と再利用性を目的としたオブジェクトになっているので、それらを実現できるように作成します。
Java Beanを使うための基本ルールは次のとおりです。
- アクセス修飾子はprivateにする
- プロパティに対するゲッターやセッターを定義
- 引数なしデフォルトコンストラクタを定義
- Serializableインタフェースの実装
この4つのルールに従って、Java Beanは作られます。各ルールについて詳しく解説していきます。
アクセス修飾子はprivateにする
Java Beanではデータの安全性を確保するため、すべてのフィールドのアクセス修飾子はprivateで定義がなされます。
フィールド変数がprivateであることにより、外部からアクセスが行われないデータのカプセル化が実現できます。
ただし、privateのフィールドにデータを設定したり取得するのには、getter(ゲッター)とsetter(セッター)を使う必要があります。
プロパティに対するセッターやゲッターを定義
Java Beanでは各フィールドに対し、getterメソッドとsetterメソッドを定義します。getterメソッド名はgetフィールド名()の形式、setterメソッド名はsetフィールド名(データ型 変数名)形式での定義が基本ルールです。
データの呼び出しをしたい場合はgetterメソッドを呼び出し、データを設定する際はsetterメソッドの引数にデータが入った変数を入れます。この仕組みによって、オブジェクトデータを外部から安全に操作が可能です。
引数なしデフォルトコンストラクタを定義
Java Beanを作る際、引数なしのデフォルトコンストラクタを持つことが必須になります。理由としては、Java Beanを利用するときにデフォルトコンストラクタを使ってインスタンス生成を行うケースが多いためです。
ちなみに、デフォルトコンストラクタを定義しない場合、コンパイラが自動で引数なしのコンストラクタを作成してくれます。しかし、1つでも引数ありのコンストラクタが存在していると自動生成はされず、引数なしでインスタンス化しようとするとエラーになるので注意が必要です。
余計な不具合を発生させないためにも、コンパイラに自動生成を任せるのではなく、明示的に定義しておくことをおすすめします。
Serializableインタフェースの実装
Serializable(シリアライズ)とは、オブジェクトをバイト列に変換して保存や転送をする仕組みのこと。Java Beanでは、シリアライズ可能にするために、Serializableインタフェースの実装を行います。
注意点として、Serializableインタフェースを実装する際は、フィールドにserialVersionUIDを定義することを忘れないようにしてください。
理由としては、クラスの中身を変更・追加した場合、JavaはserialVersionUIDを自動で作り直します。しかし、変更前に保存したデータと変更後のクラスの serialVersionUID が一致しないと、InvalidClassExceptionが発生し、データを正しく読み込めなくなります。
この例外を防ぐためにも、Serializableインタフェースを実装するときは、フィールドにserialVersionUIDをセットで定義しましょう。
Java Beanの特徴
Java Beanが持つ特徴は次の3つが挙げられます。
- データの一時保存・転送に利用
- 再利用しやすい
- シンプルだからメンテナンスが簡単
それぞれの特徴について詳しく解説していきます。
データの一時保持・転送に利用
Java Beanは一時的なデータの保存や異なるコンポーネント(部品やパーツ)へのデータの受け渡しに適しています。そのため、Webアプリケーションではリクエスト要求にも活用がされます。
また、Java Beanを使えばサーバー側でデータを管理できるため、アプリケーション全体でデータの受け渡しができる点が強みです。
再利用しやすい
汎用性の高いデータ構造をしていることで、他のクラスでも再利用がしやすい点がJava Beanの特徴です。異なるシステムであっても名前や金額といったデータのやり取りが同じ場合、Java Beanなら使いまわしができるので新規で定義する必要はありません。
シンプルだからメンテナンスが簡単
Java Beanは基本ルールで統一されたシンプルな構造をしているため、メンテナンスがしやすいメリットがあります。プロパティ名の命名規則も決まっていますし、フィールドは固定でprivateです。たとえデータが増えたとしても設計ルールは変わることはないので、コードの可読性と保守性を高く維持できます。
Java Beanの作り方を解説
ここでは、Java Beanの基本的な作成手順について実際のコード例を用いて解説していきます。
今回紹介する手順は次の3ステップです。
- クラスの新規作成
- ゲッターとセッターの実装
- デフォルトコンストラクタの追加
もし、Javaの基本を知りたい場合は、以下の記事が参考になります。
Javaプログラムの作成方法についても紹介しているので、しっかり押さえておくと安心です。それでは、上から順番にJava Beanの作り方を解説していきます。
クラスの新規作成
クラス名は意味のある名前である必要があります。ここでは、ユーザー情報を管理するクラスとしてUserという名前でクラスを作成します。
注意点として、Java Beanではアクセス修飾子に決まりがあります。クラス名はpublicであること、フィールドはprivateで定義をしましょう。
セッターとゲッターの実装
次に、カプセル化の実現のためにgetterメソッドとsetterメソッドを定義します。
Java Beanのルールとして、getterメソッドとsetterメソッドはいずれもアクセス修飾子はpublicで定義しましょう。これにより、外部クラスからデータの呼び出しや設定ができるようになります。
デフォルトコンストラクタの追加
Java Springなどのフレームワークでリフレクションを使ってオブジェクトを作成する場合、デフォルトコンストラクタがあればインスタンス化がしやすいので追加しておくことを推奨します。
画像のように、フィールドの下にデフォルトコンストラクタを追加するのが一般的です。
Java Beanのルールや注意点
Java Beanのルールと実装時の注意点を把握しておくことで、メンテナンスのコストを下げたり不具合を未然に防げます。ここでは、気を付けるべきポイントに絞って解説していきます。
Java Beanのルールについて
Java Beanの基本ルールは次のとおりです。
- フィールドはprivateで定義すること
- publicなgetterとsetterを持つこと
- 引数なしデフォルトコンストラクタを持つこと
- 必要に応じてSerializableインタフェースを実装すること
Java Beanは外部から安全にデータを取り扱うことを目的としています。そのため、アクセス修飾子には注意が必要です。
これらのルールに従ってJava Beanが作成できていない場合、予期せぬバグが発生する可能性があるので気を付けてください。
Java Beanの実装時の注意点
setterメソッドを使ったデータの設定では、メソッド内部で不正な値がセットされるのを防ぐ処理(バリデーション)をしておくことで不具合を減らせます。
例えば年齢を格納する変数の場合、0より下の値は入らないようにすべきですよね。そんなとき、setterメソッド内でif文を使って不正な値が入らないようにしておけば安全です。
Javaのif文について詳しく知りたい人は、以下の記事で解説していますので参考にしてください。
Java Beanの制限やできないこと
Java Beanはデータ管理に適した設計である一方で、制限や不向きなケースも存在します。ここでは、Java Beanの利用が向いていないシチュエーションに絞って解説していきます。
複雑ロジックでは非推奨
Java Beanはデータの一時保存と転送が目的なシンプル設計のため、複雑なロジックを持たせるのは非推奨です。例えばデータベースの操作や計算処理をBean内で行うというのは、コードの管理が複雑化する原因の1つでしょう。
Java Beanのコードの可読性が優れている利点を潰してしまう行為なので、メインロジックとJava Beanの役割を明確にし、クラス分けをすることをおすすめします。
セッション管理に不向き
Webアプリケーションなどのセッション管理では、ユーザーごとに状態を保持する必要がありますが、Java Beanは状態を持たない設計のため不適切です。
Java Beanはリクエストごとに生成・破棄を行うため、新しいインスタンスが生成されると以前の情報を保持できません。
ただし、Java Springフレームワークを使っている場合は、@SessionScoped アノテーションでJava Beanをセッションごとに管理できますが、Java Springフレームワークを使わない環境下の場合は、セッション管理に使わないようにしてください。
非同期や並列処理では使わない
非同期処理や並列処理では、Java Beanの使用はおすすめできません。理由としてはJava Beanは単一スレッドで動作することを想定して設計されたものであり、複数のスレッドから同時にアクセスされると、データ競合や不整合が発生するリスクが高いためです。
また、マルチスレッド環境でJava Beanを利用してしまうと、データの上書きにより予期せぬ動作を引き起こしかねません。もし、どうしてもJava Beanを使いたい場合は、スレッドセーフなデータ構造を利用して競合を防ぐようにしましょう。
まとめ
Java Beanはデータ管理クラスとして非常に優れた設計が特徴です。基本ルールをしっかり押さえた状態で利用すれば、メンテナンスのコストも低いですし、データのやり取りも安全です。
本記事では、Java Beanの基本構成から作り方まで解説しました。ぜひ、使い方をマスターしてJavaプロジェクトで活用してみてください。
