ウィキペディアからの引用:
POJOは、Plain OldJavaObjectの頭字語です。この名前は、特定のオブジェクトが特別なオブジェクトではなく、通常のJavaオブジェクトであることを強調するために使用されます。
POJOは通常単純なので、他のライブラリ、インターフェイス、または注釈に依存しません。これにより、これを複数のプロジェクトタイプ(Web、デスクトップ、コンソールなど)で再利用できる可能性が高くなります。
コメントで誰かがすでに指摘しているように、オブジェクトは技術的にはすでにPOJOですが、JavaBeansに似たゲッターとセッターについて具体的に質問しています。
ゲッターとセッターを使用する理由はいくつか考えられます。
- 一部の値のみを取得したい場合があります(つまり、読み取り専用の値)。フィールドを使用すると、クライアントは値を直接取得および設定できます。フィールドがfinalとしてマークされている場合、フィールドを読み取り専用にすることができますが、これは必ずしも不変であるとは限りません(ポイント9を参照)。
- Getterメソッドとsetterメソッドを使用すると、クラスのパブリックインターフェイスを壊すことなく、基になるデータ型を変更できます。これにより、クラス(およびアプリケーション)の堅牢性と変更に対する回復力が向上します。
- 値が取得または変更されたときに通知を発行するなど、他のコードを呼び出すこともできます。これは、現在のクラスでは不可能です。
- 場合によってはセキュリティリスクとなる可能性のあるクラスの実装を公開しています。
- Java BeanはPOJOを中心に設計されています。つまり、クラスが1つとして実装されていない場合、クラスがこれらの確立された原則に準拠することを期待する特定のツールやライブラリでは使用できません。
- フィールドの連結であるか、フィールドによって裏付けられているかなど、フィールドIEで計算された値に裏打ちされていない値を公開できます。
getFullName()
getFirstName()
getLastName()
- セッターメソッドに検証を追加して、渡される値が正しいことを確認できます。これにより、クラスが常に有効な状態になります。
- ゲッターとセッターにブレークポイントを設定して、値が取得または変更されたときにコードをデバッグできるようにすることができます。
- フィールドがオブジェクト(つまり、プリミティブ型ではない)の場合、クラスの内部状態は他のオブジェクトによって変更される可能性があり、バグやセキュリティリスクにつながる可能性があります。オブジェクトのコピーを返すことで、POJOのゲッターでこのシナリオから保護できるため、クライアントはオブジェクトの状態に影響を与えることなくデータを操作できます。クライアントは参照されているオブジェクトに変更を加えることができるため(オブジェクト自体が可変である場合) 、最終フィールドがあると必ずしもこの種の攻撃から保護されるとは限らないことに注意してください。一度設定されたフィールドを別の参照に向けることはできません。 。
はい、メソッド呼び出しを介した値へのアクセスまたは設定は、直接のフィールドアクセスよりも遅い場合がありますが、違いはほとんど目立たず、プログラムのボトルネックにはなりません。
利点は明らかですが、これはゲッターとセッターが特効薬であることを意味するものではありません。実世界の堅牢でスケーラブルなクラスを設計する際に考慮すべき「落とし穴」がいくつかあります。
非常によく似た質問に対するこの回答では、ゲッターとセッターを含むクラスを設計する際の考慮事項について詳しく説明します。提案は、設計しているクラスのタイプによってはより適切な場合がありますが、EGは、単純なデータ転送オブジェクトではなく、大規模なシステムでAPIの一部を形成するクラスです。
また、速度が重要な場合やメモリが制限されている場合など、直接フィールドを持つクラスが有利な場合があることにも注意してください。ただし、これは、コードをプロファイリングして実際にボトルネックであることがわかった後でのみ検討する必要があります。
また、すべてのフィールドをゲッターとセッターでラップしているだけではないことに注意してください。これは、カプセル化のポイントが実際に欠落しているためです。
この回答は、ゲッターとセッターを備えたJavaBeanスタイルのオブジェクトではなくPOJOを選択する理由の概要を示しています。