1. ホーム
  2. java

[解決済み] Javaでマーカーインターフェース?

2022-05-29 06:20:39

質問

Javaにおけるマーカーインターフェースは空のインターフェースであり、このインターフェースを実装するクラスのオブジェクトがシリアライズやクローンなどの特別な方法で扱われなければならないことをコンパイラやJVMに知らせるために使用されると教わりました。

しかし、最近、私はそれが実際にはコンパイラやJVMとは何の関係もないことを学びました。たとえば Serializable インターフェイスの場合、メソッド writeObject(Object)ObjectOutputStream は、次のようなものです。 instanceOf Serializable を実装しているかどうかを検出するために、クラスは Serializable をスローします。 NotSerializableException といった具合になります。 全てはコードで処理され、これはデザインパターンのようなので、独自のマーカーインターフェースを定義することができると思います。

さて、私の疑問です。

  1. 上記の1点目で述べたマーカーインターフェースの定義は間違っているのでしょうか?では、どのようにマーカー・インターフェースを定義すればよいのでしょうか。

  2. を使う代わりに instanceOf 演算子を使う代わりに、なぜメソッドは次のようにできないのでしょうか? writeObject(Serializable) のように、実行時ではなくコンパイル時に型チェックを行うようにできないでしょうか?

  3. アノテーションはマーカーインターフェースよりどのように優れていますか?

どのように解決するのですか?

  1. 1.のマーカインターフェースの定義は間違っていますか? - (1)マーカーインターフェースは空でなければならない、(2)それを実装することで実装クラスが何らかの特別な扱いを受けることを意味する、という部分では正しいです。間違っているのは、JVMやコンパイラがそのクラスのオブジェクトを別扱いすることを暗示している部分です。これらのオブジェクトをクローン可能、シリアライズ可能などとして扱うのは、Javaクラスライブラリのコードであるという観察は正しいのです。それは、コンパイラーやJVMとは何の関係もありません。
  2. instanceOf 演算子を使用する代わりに、なぜメソッドは次のようなものにならないのでしょうか。 writeObject(Serializable) のようにすれば、コンパイル時に型チェックが行われます。 - これによって、quot;プレーンな Object が必要なときに、マーカーインターフェースの名前でコードを汚さずに済みます。例えば、シリアライザブルにする必要があるクラスで、オブジェクトのメンバを持つ場合、キャスティングを行うか、オブジェクトを Serializable にしなければなりません。これは、インターフェイスに機能がないため、不便である。
  3. アノテーションはマーカーインターフェースよりどのように優れているのですか? - アノテーションは、クラスに関するメタデータをその消費者に伝えるという同じ目的を、そのために別の型を作成することなく達成することを可能にします。アノテーションはより強力で、プログラマーはより洗練された情報を、それを消費するクラスに渡すことができます。