1. ホーム
  2. java

[解決済み] なぜJavaBeansの代わりにimmutable POJOを使用してはいけないのですか?

2023-09-10 05:01:06

質問

私は今までにいくつかの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の規約を前提とした環境と対話する必要がない。
  • オブジェクトのクローン時に状態をコピーするのが簡単(あるいは最低限可能)である。
  • オブジェクトのクローンを作成する予定がまったくない場合。
  • 上記のようにプロパティにアクセスする方法を変更する必要がないと確信している。
  • あなたのコードが十分にオブジェクト指向でないことについての泣き言 (または嘲笑) を聞くことを気にしない。