[解決済み] なぜJavaBeansの代わりにimmutable POJOを使用してはいけないのですか?
質問
私は今までにいくつかのJavaアプリケーションを実装してきましたが、今のところデスクトップアプリケーションのみです。私は、アプリケーション内でデータを受け渡すために、ミューテーター (セッター とゲッター )を持つオブジェクトを使用する代わりに、アプリケーション内でデータを渡すために不変のオブジェクトを使用するのが好きです。
しかし、Javaの世界では、JavaBeansを使う方がずっと一般的なようで、なぜ代わりにそれを使わなければならないのかが理解できません。個人的には、状態を常に変異させるのではなく、イミュータブルなオブジェクトだけを扱う方がコードが良く見えます。
においても、Immutableオブジェクトが推奨されています。 項目15: 変異可能性を最小にする , エフェクティブジャバ2ed .
もし私がオブジェクト
Person
として実装され
JavaBean
として実装すると、次のようになります。
public class Person {
private String name;
private Place birthPlace;
public Person() {}
public setName(String name) {
this.name = name;
}
public setBirthPlace(Place birthPlace) {
this.birthPlace = birthPlace;
}
public String getName() {
return name;
}
public Place getBirthPlace() {
return birthPlace;
}
}
また、同じように
Person
として実装された
不変の
オブジェクトとして実装されています。
public class Person {
private final String name;
private final Place birthPlace;
public Person(String name, Place birthPlace) {
this.name = name;
this.birthPlace = birthPlace;
}
public String getName() {
return name;
}
public Place getBirthPlace() {
return birthPlace;
}
}
あるいは、より近い
struct
をCで表現しています。
public class Person {
public final String name;
public final Place birthPlace;
public Person(String name, Place birthPlace) {
this.name = name;
this.birthPlace = birthPlace;
}
}
実装の詳細を隠すために、immutableオブジェクトにゲッターを持たせることもできますね。しかし、私はそれを
struct
としてしか使わないので、quot;getters" を省略し、シンプルにしておく方が好きです。
単純に、私はなぜJavaBeansを使用するのが良いのか、あるいは私の不変のPOJOを続けることができ、そうすべきなのか、理解できませんか?
多くのJavaライブラリはJavaBeansをより良くサポートしているようですが、もしかしたら、イミュータブルPOJOのサポートが時間の経過とともにより一般的になっていくのでしょうか?
どのように解決するのですか?
JavaBeansを優先する場合
- JavaBeansを期待する環境と対話しなければならないとき
- インスタンス作成時にすべての初期化を行うのが面倒なプロパティがたくさんある場合。
- 何らかの理由でコピーにコストがかかるか不可能であるが、突然変異を必要とする状態がある場合。
- ある時点で、プロパティにアクセスする方法を変更しなければならないと考えている (例: 保存値から計算値への移行、アクセスの承認など)。
- JavaBeans を使用することがよりオブジェクト指向的であると無頓着に主張するコーディング標準に準拠したい場合。
次のような場合に Immutable POJO を優先します。
- 少数の単純なプロパティを持っている場合
- JavaBeanの規約を前提とした環境と対話する必要がない。
- オブジェクトのクローン時に状態をコピーするのが簡単(あるいは最低限可能)である。
- オブジェクトのクローンを作成する予定がまったくない場合。
- 上記のようにプロパティにアクセスする方法を変更する必要がないと確信している。
- あなたのコードが十分にオブジェクト指向でないことについての泣き言 (または嘲笑) を聞くことを気にしない。
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Java の switch case 文で必要な定数式の問題の解決法
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
シェルコマンドやスクリプトのJavaコール
-
-bash: java: コマンドが見つからない 解決方法
-
FindBugの使用概要
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み】なぜjava.util.loggingを使用しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
型に解決できない エラー解決
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
強制型変換について
-
無効なメソッド宣言
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
コンストラクタDate()が未定義である問題
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
Java:未解決コンパイル問題の解決方法
-
アクセス制限の解決方法: ---- in Java