标记接口或布尔方法来识别对象功能?

mik*_*era 5 java oop api-design properties marker-interfaces

我正在开发一个较大的Java类层次结构,其中一些具有我在运行时查询感兴趣的特定属性(该属性绝对仅适用于类,而不是特定实例).

我可以创建一个抽象的布尔方法isFooBar(),子类可以实现它来指示属性是否存在:

public abstract class MyBaseClass {
  ...
  public abstract boolean isFooBar();
}
Run Code Online (Sandbox Code Playgroud)

或者我可以使用标记接口FooBarProperty并对接口进行instanceof检查:

public class MyConcreteClass extends MyBaseClass implements FooBarProperty {
   ...
}
Run Code Online (Sandbox Code Playgroud)

或者我猜您甚至可以使用AmitD建议的注释:

@FooBarAnnotation
public class MyConcreteClass extends MyBaseClass {
   ...
}
Run Code Online (Sandbox Code Playgroud)

每种方法的优缺点是什么,通常应该优先考虑哪些方法?

Koj*_*tak 2

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

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