接口作为标签在java OO中是一种不好的做法吗?

时间:2009-09-17 04:12:48

标签: java interface label

在解析某些xml文件的过程中,我遇到了一种情况,我必须使用界面作为标签来识别某些标签属于某个类别,例如,我创建了一个标记界面确定这些类用于表示xml标记, ContainableTag 指出某些标记可​​以是某些标记的子标记之一。

然后我偶然发现了这个页面:http://xahlee.org/java-a-day/interface.html(请查找“ Interface as Labels ”会话。)。它说:

  

问题的关键在于它   一段数学上无关紧要的   语言。作为标签机制   用一种语言,为可能的   受益于软件工程   透视,那不应该   作为课程的一部分而设计   界面,自概念   标签和编程概念   界面,在语义上是完全不同的。

接口作为标签一定是不好的做法吗?作为一名java程序员,我们还有其他一些选择吗?

3 个答案:

答案 0 :(得分:8)

作为标记的接口在很大程度上已被Java 5或更高版本中的注释机制所取代。它们允许您添加任意元数据。如果您的接口是空的并且仅用作类标记,那么您应该使用注释。

答案 1 :(得分:7)

虽然注释可以提供标记接口完成的替代方法,但它们仅在Java中可用,并且不能与IDE很好地集成:我还使用标记接口来标记项目中的相关概念,然后我可以使用该类型层次结构浏览器找到所有成员(我想最终将由主要IDE支持注释)。

至于你提到的那篇文章,我认为如果一个类在语法上/结构上“完成”一个接口,那个接口可能/应该自动应用到类中(“Any类可以声明它[ RandomAccess]作为接口......“)。在我看来,那是倒退的想法。

我认为在`instanceof'语句中使用这种标记接口的地方使用反向逻辑,但只要你陷入没有多重继承,方面和注释的语言中,我认为没有更好的在没有走出基础语言的情况下实现这一目标的方法。

另请注意,关于空接口始终适用的这种无关紧要的参数也可以应用于注释。

答案 2 :(得分:5)

注释不一定是你想要的。标记接口是一种将类型属性处理为类型本身的方法。例如,如果您即将开始编写如下代码:

@interface ContainableTag{}

@ContainableTag public class Foo {}

// ... elsewhere...

/**
 * Adds obj as a child element.
 * @throws IllegalArgumentException if obj is not tagged with 
 *         the ContainableTag annotation.
 */
public void addElement(Object obj){
    if (!obj.getClass().isAnnotationPresent(ContainableTag.class))
        throw new IllegalArgumentException("obj is not a ContainableTag");
    // add the containable tag as an element
}

然后考虑一下你是否真的不认为这看起来更好:

interface ContainableTag {}

public class Foo implements ContainableTag {}

// ... elsewhere...

public void addElement(ContainableTag ct){
    // add the containable tag as an element
}

当然,标记接口不提供有关类型本身提供的行为的任何信息,但 允许其他类型强制执行此非行为属性。如果ObjectOutputStream使用writeObject(Serializable)方法而不是writeObject(Object),我当然可以避免许多恼人的错误。

编辑:我在这里not insignificant support