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

标记接口没有任何方法。在您的情况下,您的界面有一个获取属性的方法,在此基础上您应该使用 interface. 您可以简单地使用此接口来保存实现您的接口的类的具体实例,并可以调用与属性相关的方法。

但是,在另一端使用或标记了标记和实例或层次结构,以便它符合某些特性,如持久性。

于 2012-10-01T07:56:51.953 回答
2

标记接口在类层次结构中继承,因此它们的功能有限(您不能为某些特定子类“删除”此标记接口),我不推荐它们(Cloneable 是一个不好的例子)。问题是 - 您的属性是否真的绑定到对象的类,而不是实例?如果是这样,注释会更好,因为它们不会在您的 API 中添加额外的方法并且它们更易于维护 - 您只需添加/删除注释(在检查方法的情况下,您必须检查所有子类,它们是否覆盖它与否)。

编辑:在你的情况下,我会问自己一个问题:我的属性是像“持久”(适用于给定类的所有实例)还是“可见”(仅适用于某些实例)

于 2012-10-01T08:33:29.330 回答