JavaBeanとPOJOの違いは何ですか?


210

違いはわかりません。私はHibernateを使用していますが、一部の書籍では、JavaBeanとPOJOを同義語として使用しています。Hibernateのコンテキストだけでなく、一般的な概念としての違いがあるかどうかを知りたいです。

回答:


252

JavaBeanは特定の規則に従います。ゲッター/セッターの命名、デフォルトのパブリックコンストラクター、シリアル化可能など。詳細については、JavaBeansの規約を参照してください。

POJO(plain-old-Java-object)は厳密には定義されていません。特定のフレームワークと互換性を持たせるために特定のインターフェイスを実装したり、特定の基本クラスから派生したり、特定の注釈を利用したりする必要のないJavaオブジェクトであり、任意のものにすることができます(多くの場合比較的単純)。 Javaオブジェクト。


41
JavaBeanはPOJOである可能性があり、通常はPOJOであり、多くのPOJOは実際にはJavaBeanです。
ヨアヒムザウアー

8
いいえ、POJOの定義では、Java BeanはPOJOではありません。JavaBeanと見なされるためには、クラスは特定のコーディング規則に従う必要があるためです(たとえば、引数のないコンストラクターを持ち、「get」という単語で始まるメソッドを持つか、 "set")またはBeanInfoクラスとともに配布されます。
ナット・

15
これらは慣例であるため、BeanがPOJOになる可能性がある(たとえば、JavaBeanインターフェースなどから継承していない)とうまく主張できると思います
Brian Agnew

1
JavaBeans仕様では、JavaBeanを「再利用可能なソフトウェアコンポーネント」などとして大まかに定義することに失敗しています。引数なしのコンストラクターは必要ありません。「get」または「set」で始まるメソッドは必要ありません。直列化可能である必要はなく、クラスである必要もありません。
トムホーティン-10

4
数学的には、JavaBeanはPOJOのサブセットを形成していると言えます。これは、POJOに課せられた特定の制約により、JavaBeanになるためです。
Nishit

106

すべてのJavaBeanはPOJOですが、すべてのPOJOがJavaBeanであるとは限りません。

JavaBeanは、特定のプログラミング規則を満たすJavaオブジェクトです。

  • JavaBeanクラスはSerializableまたはExternalizableを実装する必要があります。
  • JavaBeanクラスには、引数のないパブリックコンストラクタが必要です。
  • すべてのJavaBeanプロパティには、パブリックセッターメソッドとゲッターメソッド(必要に応じて)が必要です。
  • すべてのJavaBeanインスタンス変数はプライベートである必要があります。

1
POJOは実装できないと思いましたSerializable
naXa

10
「JavaBeanクラスには引数のないコンストラクターが必要です。」ここにもパブリックを追加
radistao

JavaBeanはシリアライズ可能であり、そのためJavaBeanはPOJOではありません。
karlihnos 2017年

25

Martin Fowlerによると、POJOはビジネスロジックをカプセル化するオブジェクトであり、Bean(他の回答ですでに定義されている定義を除く)は、データを保持するためのコンテナーであり、オブジェクトで使用できる操作はデータを設定および取得するだけです。

この用語は、2000年9月の会議でのレベッカパーソンズ、ジョシュマッケンジー、および私が講演の準備をしているときに生まれました。この講演では、エンティティBeanを使用するのではなく、ビジネスロジックを通常のJavaオブジェクトにエンコードすることの多くの利点を指摘していました。なぜシステムで通常のオブジェクトを使用することに反対するのか疑問に思い、単純なオブジェクトにはファンシーな名前が欠けていたためだと結論付けました。だから私たちは彼らに1つを与えました、そしてそれは非常にうまくキャッチされました。

http://www.martinfowler.com/bliki/POJO.html


7

POJO:他の外部のサードパーティライブラリサポートなしで、クラスが基本的なJDKで実行できる場合、その呼び出されたPOJO

JavaBean:クラスにアクセサ(セッターとゲッター)を持つ属性のみが含まれる場合、それらはjavabeansと呼ばれます。JavaBeanは通常、ビジネスロジックを含まず、データを保持するために使用されます。

すべてのJavabeanはPOJOですが、すべてのPOJOはJavabeanではありません


7

Pojo-プレーンな古いJavaオブジェクト

pojoクラスは特別なものを持たない通常のクラスであり、テクノロジー/フレームワークから完全に疎結合されたクラスです。このクラスはテクノロジー/フレームワークから実装されておらず、テクノロジー/フレームワークAPIから拡張されていません。このクラスはpojoクラスと呼ばれます。

pojoクラスはインターフェースを実装してクラスを拡張できますが、スーパークラスまたはインターフェースはテクノロジー/フレームワークであってはなりません。

例:

1。

class ABC{
----
}

ABCクラスがテクノロジー/フレームワークを実装または拡張していないため、これがpojoクラスです。

2。

class ABC extends HttpServlet{
---
}

サーブレットテクノロジーAPIから拡張されたABCクラス。これが、pojoクラスではない理由です。

3。

class ABC implements java.rmi.Remote{
----
}

ABCクラスはrmi apiから実装するため、これはpojoクラスではありません。

4。

class ABC implements java.io.Serializable{
---
}

このインターフェースはテクノロジー/フレームワークの一部ではなく、Java言語の一部です。したがって、これはpojoクラスです。

5。

class ABC extends Thread{
--
}

ここでスレッドもjava言語のクラスなので、これもpojoクラスです。

6。

class ABC extends Test{
--
}

Testクラスがテクノロジー/フレームワークから拡張または実装する場合、ABCもTestクラスのプロパティを継承するため、pojoクラスではありません。Testクラスがpojoクラスでない場合、ABCクラスもpojoクラスではありません。

7。

今、この点は例外的なケースです

@Entity
class ABC{
--
}

@Entityhibernate apiまたはjpa apiによって提供される注釈ですが、このクラスをpojoクラスとして呼び出すこともできます。テクノロジー/フレームワークから与えられた注釈を持つクラスは、この例外的なケースではpojoクラスと呼ばれます。



1

POJOS特定の規則(getter / setter、引数なしのパブリックコンストラクター、プライベート変数)があり、動作している(たとえば、フォームでデータを読み取るために使用されている)はJAVABEANSです。


1

要約すると、類似点と相違点は次のとおりです。

   java beans:                          Pojo:
-must extends serializable              -no need to extends or implement.
 or externalizable.                     
-must have public class .               - must have public class
-must have private instance variables.      -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor.           - can have constructor with agruments.

すべてのJAVA BeanはPOJOですが、すべてのPOJOがJAVA Beanであるとは限りません。


0

上記の正式な定義を見てきましたが、それらはすべて価値があります。

しかし、定義にこだわりすぎないでください。ここで物事の感覚をもっと見てみましょう。

JavaBeansはエンタープライズJavaアプリケーションで使用され、ユーザーは頻繁にリモートから、つまりサーバーを介して(Webまたはプライベートネットワーク経由で)ネットワーク経由でデータやアプリケーションコードにアクセスします。したがって、関連するデータは、ユーザーのコンピューターとの間でシリアル形式でストリーミングする必要があります。そのため、Java EEオブジェクトがSerializableインターフェースを実装する必要があります。これだけのJavaBeanの性質は、データがファイルシステムから読み取られたり、ファイルシステムに書き込まれたりするJava SEアプリケーションオブジェクトと同じです。さまざまなユーザーマシン/ OSの組み合わせからネットワークを介してJavaクラスを確実に使用するには、それらの処理に関する規則の採用も必要です。したがって、これらのクラスを、プライベート属性、引数なしのコンストラクター、および標準化されたゲッターとセッターを使用して、パブリックとして実装するための要件。

Java EEアプリケーションは、JavaBeansとして実装されたクラス以外のクラスも使用します。これらは、入力データの処理や出力データの整理に使用できますが、ネットワーク経由で転送されるオブジェクトには使用されません。したがって、Javaオブジェクトとして有効であることを禁止するために、上記の考慮事項をそれらに適用する必要はありません。これらの後者のクラスは、POJO(Plain Old Java Object)と呼ばれます。

全体として、Java Beanはネットワーク上での使用に適合した単なるJavaオブジェクトと見なすことができます。

1995年以来、ソフトウェアの世界では、非常に多くの誇大広告があり、それは少なからずあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.