マーカー インターフェイスに実装するものが何もない場合、実装するのは何にSerializable
使用されますか?
9 に答える
Joshua Bloch:Effective Java 2nd Edition、p 179
アイテム37:マーカーインターフェイスを使用してタイプを定義する
...マーカー注釈(アイテム35)によってマーカーインターフェイスが廃止されると言われることがあります。この主張は正しくありません。マーカーインターフェイスには、マーカー注釈に比べて2つの利点があります。何よりもまず、マーカーインターフェイスは、マークされたクラスのインスタンスによって実装されるタイプを定義します。マーカー注釈はそうではありません。このタイプの存在により、マーカーアノテーションを使用した場合、実行時までキャッチできなかったコンパイル時のエラーをキャッチできます。
個人的には、このテーマに関するジョシュアの優れた知識に屈するつもりです。
以前のバージョンの Java では、Marker Interfacesがクラスに関するメタデータを宣言する唯一の方法でした。たとえば、Serializable Marker Interface を使用すると、クラスの作成者は、クラスがシリアライズおよびデシリアライズされたときに正しく動作することを宣言できます。
最新の Java では、マーカー インターフェースの場所はありません。これらは、非常に柔軟なメタデータ機能を可能にするAnnotationsに完全に置き換えることができます。クラスに関する情報があり、その情報が変更されない場合、注釈はそれを表す非常に便利な方法です。
このようなマーカー インターフェイスは、オブジェクトが何らかのマーカー インターフェイスを実装しているかどうかに応じて、他のコードが決定を下す場合に役立ちます。
の場合Serializable
、オブジェクトのフィールドをシリアル化するためにリフレクションが使用されます。
サブクラスに伝播しないため、注釈が優先されます。
マーカー インターフェイス パターンを参照してください。
これは、クラス (およびその結果、一時的ではないすべてのフィールド) がシリアル化の候補であることを示します。また、シリアライゼーションに依存するフレームワークを構築している場合は、もちろん次のようにメソッドを記述できます。
public void registerObject(Serializable obj);
受け入れる準備ができているクラスを制限します。
シリアル化されたオブジェクトはシステム間で互換性を維持する必要があるため、シリアル化は明示的な設計上の決定であり、そのような候補を識別するためにマーカー インターフェイスを使用する必要があります。
セキュリティ面もあります。すべてをシリアライズ可能にしたくはありません。そうしないと、シリアライズによってパスワードやその他の機密データを誤って (たとえば) 公開する可能性があります。
これらはマーカーインターフェイスと呼ばれます。名前が示すように、オブジェクトが特定の種類の操作に使用できることを示します。
Serializable
たとえば、オブジェクトが Java シリアライゼーションに適していることを意味します。
機能が非常に似ているため、注釈に置き換えるべきではないかどうかについては議論されています。
インターフェイスを実装する場合はinstanceof
true になります。インターフェイスに実装するものが何もない場合は、これを使用して、実装者に特別なことを強制することなく、アノテーションが Java 1.5 以降で行うように、メタデータでクラスをマークできます。
空のインターフェースは、フィールドの検査/変更とメソッドのディスパッチに基づくプログラムの「標準」実行に影響を与えないという推論は正しいです。
ただし、マーカー インターフェイスはリフレクションと組み合わせて使用すると便利です。ライブラリ/メソッドは (リフレクションを介して) オブジェクトを検査し、そのクラスがマーカー インターフェイスを実装している場合は異なる動作をします。Java5 の時点では、マーカー インターフェースの必要性はほとんどありません。Java アノテーションを介して同じ「マーキング」機能を実現できます。(ここでも) ほとんどの効果は、リフレクション ベースのコードを介して実現されます。
主な目的は、マーカー インターフェイスを実装したクラスのオブジェクトを別の方法で処理することをコンパイラに伝えることです。
Java のマーカー インターフェイス (Serializable、Clonnable、Remote など) を注意深く見ると、コンパイラや JVM に何かを示すために使用されているように見えます。そのため、JVM が Class が Serializable であると判断した場合、そのクラスに対して何らかの特別な操作を実行します。同様に、JVM が 1 つの Class が Clonnable を実装していることを確認すると、クローニングをサポートする操作を実行します。RMI とリモート インターフェイスについても同様です。要するに、マーカーインターフェースは、コンパイラーまたはJVMに信号またはコマンドを示します。
詳細: http://javarevisited.blogspot.com/2012/01/what-is-marker-interfaces-in-java-and.html#ixzz2v6fIh1rw