5

私は Java クラスの大規模な階層を開発しています。そのうちのいくつかには、実行時に照会したい特定のプロパティがあります (プロパティは、特定のインスタンスではなくクラスにのみ適用されます)。

isFooBar()プロパティが存在するかどうかを示すためにサブクラスが実装できる抽象ブール メソッドを作成できます。

public abstract class MyBaseClass {
  ...
  public abstract boolean isFooBar();
}

または、代わりにマーカー インターフェイスを使用して、インターフェイスに対してチェックFooBarPropertyを行うこともできます。instanceof

public class MyConcreteClass extends MyBaseClass implements FooBarProperty {
   ...
}

または、AmitD によって提案されているように、注釈を使用することもできると思います。

@FooBarAnnotation
public class MyConcreteClass extends MyBaseClass {
   ...
}

各方法の長所と短所は何ですか。また、通常はどちらを優先する必要がありますか?

4

2 に答える 2

2

マーカーインターフェイスはクラス階層で継承されるため、機能が制限され(特定のサブクラスのこのマーカーインターフェイスを「削除」することはできません)、推奨できません(クローン可能はこの悪い例です)。問題は、プロパティがインスタンスではなく、オブジェクトのクラスに実際にバインドされているかどうかです。もしそうなら、アノテーションはAPIにメソッドを追加せず、メンテナンスが簡単なので、アノテーションの方が優れています。アノテーションを追加/削除するだけです(メソッドをチェックする場合は、すべてのサブクラスをチェックする必要があります。それかどうか)。

編集:あなたの場合、私は自分自身に質問します:「永続的」(特定のクラスのすべてのインスタンスに適用)または「表示」(一部のインスタンスにのみ適用)のような私のプロパティですか?

于 2012-10-01T08:33:29.330 に答える
2

マーカー インターフェイスにはメソッドがありません。あなたの場合、インターフェイスにはプロパティを取得するメソッドがあり、これに基づいてインターフェイスを使用する必要があります。このインターフェイスを使用して、インターフェイスを実装するクラスの具体的なインスタンスを保持し、プロパティに関連するメソッドを呼び出すことができます。

ただし、もう一方の端では、マーカーが使用またはマークされ、インスタンスまたは階層であるため、永続化などの特定の機能に適しています。

于 2012-10-01T07:56:51.953 に答える