2009-09-08 2 views
156

違いについては分かりません。私はHibernateを使用しており、一部の書籍では、JavaBeanとPOJOを互換性のある用語として使用しています。私は、Hibernateコンテキストだけでなく、一般的な概念として、違いがあるかどうかを知りたいと思います。JavaBeanとPOJOの違いは何ですか?

答えて

204

JavaBeanは、特定の規則に従います。 Getter/setterの命名。公開のデフォルトのコンストラクタを持ち、シリアル化可能です。詳細はJavaBeans Conventionsを参照してください。

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

+32

JavaBeanは、通常はPOJOであり、多くのPOJOは実際にはJavaBeansであることに注意してください。 –

+8

いいえ、POJOの定義では、Java BeanはJava Beanとみなされるため、POJOではありません。*クラスは特定のコーディング規則(例:引数なしのコンストラクタを持ち、 "get"や "set"という単語で始まるメソッドを持つ)、BeanInfoクラスを使って配布されます。 – Nat

+14

これは*慣例*なので、BeanがPOJOであると主張できます(例えば、JavaBeanインタフェースなどから継承していないなど) –

70

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

AのJavaBeanは、特定のプログラミング規約を満足するJavaオブジェクトである:

  • JavaBeanクラスは、シリアライズまたは外部化のいずれかを実装する必要があります。
  • JavaBeanクラスには、引数なしのpublicコンストラクタが必要です。
  • すべてのJavaBeanプロパティには、パブリックセッタメソッドとゲッタメソッド(必要に応じて)が必要です。
  • すべてのJavaBeanインスタンス変数はプライベートである必要があります。 Martin Fowler氏によると、POJOが(すでに他の回答に記載された定義を除く)豆は単にオブジェクトに利用可能なデータと操作を保持するための容器より少しである一方、ビジネス・ロジックをカプセル化するオブジェクトである
+1

私はPOJOが 'Serializable'を実装できないと考えました。 – naXa

+6

"JavaBeanクラスには引数なしのコンストラクタが必要です。また、** public ** hereを追加してください。 – radistao

+0

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

15

データを設定して取得する。

用語はレベッカ・パーソンズ、ジョシュ・マッケンジーながら鋳造されたと私は は 通常のJavaに我々 は、符号化ビジネスロジックの多くの利点を指摘された講演では2000年9月の会議で講演のために準備をしていましたEntity Beanを使用するのではなくオブジェクトを使用します。私たちはなぜ 人が自分のシステムで通常のオブジェクトを使うことに反対しているのかと疑問に思っていました。そして、 は、単純なオブジェクトには派手な名前がないためだと結論付けました。だから 私たちはそれらを1つ与え、それは非常にうまくキャッチします。特定の規則(ゲッター/セッター、公共の引数なしのコンストラクタ、プライベート変数)と作用している(例は。フォームからデータを読み出すために使用される)と

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

0

POJOSJAVABEANSあります。

3

POJO:クラスは、他の外部のサードパーティのライブラリなしで、基盤となるJDKで実行できる場合は、その呼ばPOJO

JavaBeansをサポートしています。クラスは唯一のアクセサ(セッターとゲッター)と属性が含まれている場合は、それらがJavaBeansのと呼ばれています.Java beanは一般的に、いくつかのデータを保持するために使われるのではなく、bussinessロジックを含んでいません。

すべてのJavaBeansは、POJOのですが、すべてのPOJOはありませんJavabeansなど

0

POJO -

POJOクラスは、任意の名物ない通常のクラスで、クラスは完全に緩く技術/ framework.theから結合された、昔ながらのJavaオブジェクトクラスは技術/フレームワークから実装されておらず、そのクラスがpojoクラスと呼ばれる技術/フレームワークAPIから拡張されていません。

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

例:

1.

class ABC{ 
---- 
} 

ABCクラスが実装するか、これはPOJOクラスである理由だ技術/フレームワークから延びるません。これはPOJOクラスではありません理由ですサーブレット技術のAPIから延びる

2.

class ABC extends HttpServlet{ 
--- 
} 

ABCクラス。

3.

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

ABCクラスが、これはPOJOクラスでない理由のRMI APIから実装しています。

4.

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

このインタフェースは、Java言語の一部ではない技術の一部である/ framework.soこれはPOJOクラスです。ここ

5.

class ABC extends Thread{ 
-- 
} 

スレッドので、これはまた、POJOクラスでも、Java言語のクラスです。

class ABC extends Test{ 
-- 
} 

テストクラスは、技術/フレームワークから延び又は実装している場合、それはテストクラスのプロパティを継承しているため、その後ABCはまた、POJOクラスはありません。 Testクラスがpojoクラスでない場合、ABCクラスもpojoクラスではありません。

7.

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

@Entity 
class ABC{ 
-- 
} 

@Entityは休止APIやJPA APIによって指定された注釈ですが、それでも私たちは、POJOクラスとしてこのクラスを呼び出すことができます。 この例外的なケースでは、テクノロジー/フレームワークから与えられたアノテーションを持つクラスをpojoクラスと呼びます。

関連する問題