私は、"Bean"は、プロパティとゲッター/セッターを持つJavaクラスであると理解していたと思います。私の理解では、それはC言語の構造体に相当するものです。それは本当ですか?
また、Beanと通常のクラスの間には、実際に構文上の違いがあるのでしょうか?何か特別な定義やインターフェイスがあるのでしょうか?
基本的に、なぜこのような用語があるのでしょうか?
また、Serializable
インターフェースとはどういう意味ですか?
JavaBeanは単なる標準です。
これだけです。これは単なる慣習です。 しかし、多くのライブラリがこれに依存しています。
Serializable`に関しては、APIドキュメントより。
クラスのシリアライズ機能は、クラスが java.io.Serializable インターフェースを実装することで有効になります。 java.io.Serializable インターフェイスを実装したクラスによって有効になります。このインターフェイスを実装していないクラスは インターフェイスを実装していないクラスは、そのステートがシリアル化されたり、シリアル化解除されたりすることはありません。 シリアル化可能なクラスのすべてのサブタイプは、それ自体がシリアル化可能です。シリアル化インターフェースは シリアル化インターフェースは、メソッドやフィールドを持たず、シリアル化されることのセマンティクスを シリアル化インターフェースは、メソッドやフィールドを持たず、シリアル化可能であることのセマンティクスを
言い換えれば、シリアル化可能なオブジェクトは、ストリームに書き込むことができ、したがって、ファイルやオブジェクトデータベースなど、何にでも書き込むことができます。
また、JavaBeanと他のクラスの間には構文上の違いはありません -- 標準に従っていればクラスはJavaBeanです。
このような用語があるのは、標準では、ライブラリが、あらかじめ定義された方法で定義されたクラスインスタンスを使ってプログラム的に何かを行うことができるからです。例えば、ライブラリが、あなたが渡したオブジェクトをストリーミングしたい場合、あなたのオブジェクトがシリアライズ可能であるため、ライブラリはそれが可能であることを知っています(libがあなたのオブジェクトが適切なJavaBeansであることを要求していると仮定します)。
特別なことのように聞こえるように言葉がある。 現実にはそんな神秘的なものはどこにもない。
基本的には「ビーン」です。
getFoo()
は「Foo」プロパティのゲッターです)、かつ更新します。
Serializable`について。 これは「マーカーインターフェイス」(関数を宣言しないインターフェイス)に過ぎず、実装するクラスが「シリアル化」(インスタンスをバイトのストリームに変換する処理)に同意していること(およびその能力があること)をJavaに伝えるものです。 これらのバイトは、ファイルに保存したり、ネットワーク接続で送信したりすることができ、JVM(少なくとも、オブジェクトのタイプを知っているもの)が後でオブジェクトを再構築するのに十分な情報を持っています(場合によっては、アプリケーションの別のインスタンスや、まったく別のマシン上でも可能です)。
もちろん、それを実現するためには、クラスは一定の制限に従わなければなりません。 その中でも、すべてのインスタンスフィールドは、プリミティブ型(int、boolなど)であるか、シリアル化可能なクラスのインスタンスであるか、あるいは、Javaがそれらを含めようとしないように「transient」とマークされていなければなりません。 (これはもちろん、transient
フィールドはストリーム上の移動に耐えられないことを意味します。 transient`フィールドを持つクラスは、必要に応じてそれらを再初期化する準備をしなければなりません)。
これらの制限に従えないクラスは、Serializable
を実装してはいけません(そして、IRCでは、Javaコンパイラはそうすることを 許可 してくれません)。