私は、 "Bean"はプロパティとゲッター/セッターを持つJavaクラスであると理解しました。私が理解している限りでは、これはCの構造体と同等です。本当?
また、実際の 構文上の Beanと通常のクラスの違いはありますか?特別な定義やインターフェースはありますか?
基本的に、なぜこれのための用語がありますか?
編集 :あなたがとても親切になり、Serializable
インターフェースに関する情報を追加し、それが何を意味するのか。
あなたの答えに、私はとても感謝しています。
JavaBeanは単なる 標準 です。
Serializable
を実装します。それでおしまい。それは単なる慣例です。しかし、多くのライブラリはそれに依存しています。
Serializable
に関しては、 APIドキュメントから :
クラスの直列化可能性は、Java.io.Serializableインタフェースを実装するクラスによって有効になります。このインタフェースを実装していないクラスは、その状態のいずれもシリアライズまたはデシリアライズされません。直列化可能クラスのすべてのサブタイプは、それ自体が直列化可能です。直列化インターフェースにはメソッドやフィールドはなく、直列化可能という意味を識別するためだけに使用されます。
言い換えれば、直列化可能オブジェクトはストリーム、つまりファイル、オブジェクトデータベース、その他あらゆるものに書き込むことができます。
また、JavaBeanと他のクラスの間には構文上の違いはありません。クラスが標準に準拠している場合、そのクラスはJavaBeanです。
標準では、ライブラリがプログラムによって事前定義された方法で定義したクラスインスタンスを使って処理を行うことを許可しているので、その用語があります。たとえば、ライブラリが、渡されたオブジェクトをストリーミングしたい場合、そのオブジェクトはシリアライズ可能であるため、それが可能であることを認識しています(libがあなたのオブジェクトが適切なJavaBeansであることを要求すると仮定します)。
それが特別に聞こえるようにするための用語があります。現実はそれほど不思議なところではありません。
基本的に、 "Bean":
Java.io.Serializable
を実装し、正しく実装されている)です。getFoo()
は "Foo"プロパティのgetterです)。更新:
Serializable
について:それは、実装クラスが「直列化」に同意する(そしてそれが可能であることを意味する)ことをJavaに伝える「マーカーインタフェース」(関数を宣言しないインタフェース)に他なりません。インスタンスをバイトのストリームに変換します。これらのバイトはファイルに保存したり、ネットワーク接続を介して送信したりすることができ、JVM(少なくともオブジェクトの型について知っているもの)が後でオブジェクトを再構築できるように十分な情報を持つことができます。アプリケーション、あるいは他のマシン全体でも可能です。
もちろん、そのためにはクラスは一定の制限を守らなければなりません。その中で最も重要なのは、すべてのインスタンスフィールドがプリミティブ型(int、boolなど)、同様に直列化可能なクラスのインスタンス、またはJavaがそれらを含めようとしないようにtransient
としてマークされることです。 (もちろん、これはtransient
フィールドがストリーム上での移動に耐えられないことを意味します。transient
フィールドを持つクラスは、必要に応じてそれらを再初期化する準備をする必要があります。)
これらの制限を守れないクラスはSerializable
を実装すべきではありません(そして、IIRCでは、Javaコンパイラは let しさえしません)。
JavaBeansは、非常に単純なコーディング規約に準拠したJavaクラスです。あなたがしなければならないのはそれだけです
Java.io.Serializable
インターフェースを実装する - オブジェクトの状態を保存するJavaBeansのプロパティ
JavaBeanは、特定のプログラミング規約を満たすJavaオブジェクトです。
JavaBeanクラスはSerializable
またはExternalizable
のいずれかを実装する必要があります
JavaBeanクラスには引数のないコンストラクタが必要です
すべてのJavaBeanプロパティにはパブリックセッターメソッドとゲッターメソッドが必要です
すべてのJavaBeanインスタンス変数はプライベートにすべきです
JavaBeansの例
@Entity
public class Employee implements Serializable{
@Id
private int id;
private String name;
private int salary;
public Employee() {}
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getName() {
return name;
}
public void setName( String name ) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}
例で説明します。
1. import Java.io.Serializable
シリアライゼーションに関しては、 ドキュメンテーション を参照してください。
2.プライベートフィールド
外部クラスがこれらのフィールドを簡単に変更できないようにするため、フィールドはプライベートにする必要があります。これらのフィールドに直接アクセスする代わりに、通常getter/setterメソッドが使用されます。
3.コンストラクタ
引数を持たないパブリックコンストラクタ。
4. getter/setter
プライベートフィールドにアクセスして変更するための取得メソッドおよび設定メソッド。
/** 1. import Java.io.Serializable */
public class User implements Java.io.Serializable {
/** 2. private fields */
private int id;
private String name;
/** 3. Constructor */
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
/** 4. getter/setter */
// getter
public int getId() {
return id;
}
public String getName() {
return name;
}
// setter
public void setId(int id) {
this.id = is;
}
public void setName(String name) {
this.name = name;
}
}
Java Beansは、より少ないコードとより多くの作業アプローチのために使用されています... Java Beansは、ランタイムの発見とアクセスのための普遍的な契約としてJava EE全体で使用されています。たとえば、JavaServer Pages(JSP)は、ページ間またはサーブレットとJSP間のデータ転送オブジェクトとしてJava Beansを使用します。 Java EEのJavaBeans Activation Frameworkは、MIMEデータ型のサポートをJava EEに統合するためにJava Beansを使用します。 Java EE管理APIは、Java EE環境で管理されるリソースのインスツルメンテーションの基盤としてJavaBeansを使用します。
直列化について
オブジェクトの直列化では、オブジェクトは、オブジェクトのデータ、およびオブジェクトの種類とオブジェクトに格納されているデータの種類に関する情報を含む一連のバイトとして表すことができます。
シリアル化されたオブジェクトは、ファイルに書き込まれた後、ファイルから読み取られて逆シリアル化されます。つまり、オブジェクトとそのデータを表す型情報とバイトを使用して、オブジェクトをメモリに再作成できます。
Beanは永続化され、それらのサーバー間で転送されるため、プロジェクトを複数のサーバーにまたがってデプロイする場合は、シリアル化が便利です。
Java Beansは標準であり、その基本的な構文要件は他の回答によって明確に説明されています。
しかし、IMO、それは単純な構文標準以上のものです。 Java Beansの本当の意味または意図された使用法は、標準を中心としたさまざまなツールのサポートとともに、コードの再利用とコンポーネントベースのソフトウェアエンジニアリングを容易にします。コード(またはほんの少しのりコードを書くだけでよい)。残念ながら、このテクノロジは業界ではあまり見積もられておらず、あまり活用されていません。これは、このスレッドの回答からわかります。
Oracleの Java Beansのチュートリアル を読むと、その中でよりよく理解できます。
ウィキペディアのとおり:
このクラスには、パブリックのデフォルトコンストラクタ(引数なし)が必要です。これにより、編集およびアクティブ化フレームワーク内で簡単にインスタンス化できます。
クラスのプロパティは、標準の命名規則に従って、get、set、is(getの代わりにブール値のプロパティに使用できます)、およびその他のメソッド(いわゆるアクセサメソッドおよびミューテータメソッド)を使用してアクセスできる必要があります。これにより、フレームワーク内でBeanの状態を簡単に自動検査および更新することができます。フレームワークの多くには、さまざまなタイプのプロパティ用のカスタムエディタが含まれています。セッターは1つ以上の引数を持つことができます。
クラスは直列化可能であるべきです。 [これにより、アプリケーションおよびフレームワークは、VMおよびプラットフォームとは無関係に、Beanの状態を確実に保存、格納、および復元できます。
より多くの情報のためにこの リンクをたどってください。
質問の後半では、直列化はオブジェクトを符号付きバイトのシーケンスとして格納するために使用される永続化メカニズムです。形式的には言えませんが、オブジェクトの状態を格納しているので、後でシリアル化解除することで取得できます。
Java Beanは、[概念] Javaクラスであり、次の規則に従います。
それは再利用可能なソフトウェアコンポーネントです。同じオブジェクトに複数の場所からアクセスできるように、多くのオブジェクトを1つのオブジェクトにカプセル化できます。これは、コードのメンテナンスを容易にするためのステップです。
それらは直列化可能で、引数がゼロのコンストラクタを持ち、getterメソッドとsetterメソッドを使ってプロパティにアクセスすることができます。 "Bean"という名前は、Java用の再利用可能なソフトウェアコンポーネントを作成することを目的としたこの標準を包含するために与えられました。according to
wiki
アプリケーションのバックボーンを形成し、Spring IoCコンテナによって管理されるオブジェクトはBeanと呼ばれます。 Beanは、Spring IoCコンテナによってインスタンス化、アセンブル、およびその他の方法で管理されるオブジェクトです。それ以外の場合、Beanは単にアプリケーション内の多数のオブジェクトのうちの1つです。 according to
spring io 。
Java Beanは本質的にクラスであり、クラスをBeanとして分類するものは次のとおりです。
SerialVersionUIDフィールドは、オブジェクトの状態を維持するために重要です。以下のコードはBeanとして機能します。
public class DataDog implements Java.io.Serializable {
private static final long serialVersionUID = -3774654564564563L;
private int id;
private String nameOfDog;
//The constructor should NOT have arguments
public DataDog () {}
/** 4. getter/setter */
// getter(s)
public int getId() {
return id;
}
public String getNameOfDog() {
return nameOfDog;
}
// setter(s)
public void setId(int id) {
this.id = id;
}
public void setNameOfDog(String nameOfDog) {
this.nameOfDog = nameOfDog;
}}
JavaBeanを理解するには、次の点に注意する必要があります。JavaBeanは概念的なものであり、特定のもののクラスを表すことはできません。
JavaBeanは再利用可能なソフトウェアコンポーネントの操作で視覚化することができる開発ツールです
JavaBeanはSun JavaBeans仕様に基づいており、再利用可能なコンポーネントにすることができます。その最大の特徴は再利用性です。
Beanの概念に関するちょっとした背景/更新。他にも多くの答えが実際にはありますが、それほど多くはありません。
それらはGUIの構築の一環としてJavaで早くから発明されました。それらは、ツールのプロパティパネルを作成させてBeanの属性を編集できるようにするためにツールが引き離しやすいパターンに従ったものです。一般に、Beanプロパティは画面上のコントロールを表します(x、y、幅、高さ、テキストなどを考えてください)。
強く型付けされたデータ構造と考えることもできます。
時間が経つにつれて、これらは同じタイプのアクセスを使用する多くのツールに役立ちました(たとえば、データ構造をデータベースに永続化するためのHibernate)。
ツールが進化するにつれて、それらはアノテーションの方へ移動し、セッター/ゲッターの名前を引き離すことを避けました。ほとんどのシステムはBeanを必要としません。アノテーション付きプロパティを持つ単純な古いJavaオブジェクトを使ってそれらを操作する方法を伝えることができます。
今、私は豆を注釈付きプロパティボールと見なしています - それらは実際にそれらが持っている注釈にしか役に立ちません。
豆自体は健康的なパターンではありません。それらはすべてのプロパティを外部操作にさらすので、本質的にカプセル化を破壊します。使われるにつれて、Beanの内部でコードを作成する代わりにBeanを外部で操作するコードを作成する傾向があります。値をオブジェクトに要求しないでください。オブジェクトに何かを実行するように要求してください。 ")最小限のゲッターとセッターのないアノテーション付きのpojosを使うことはカプセル化を元に戻すことと不変性の可能性をはるかにOOします。
ところで、このようなことがすべて起こっているので、誰かがその概念をEnterprise Java Beansと呼ばれるものに拡張しました。これらは...違います。そしてそれらは十分に複雑であるため、多くの人がBeanの概念全体を理解していないと感じ、この用語の使用をやめました。これが、一般的にBeanがPOJOと呼ばれるのを聞く理由です(すべてのJavaオブジェクトはPOJOなのでこれは技術的には問題ありませんが、誰かがPOJOと言うのを聞くと、彼らはBeanパターンに従う何かについて最もよく考えています)