Item 使用标记接口来定义类型

定义和目的


标记界面:

  • 不包含方法声明。
  • 将类标记为具有特定属性。
  • 示例:serialized 表示一个类可以被序列化。
  • 标记接口的优点

类型定义:

  • 标记接口定义类实例实现的类型。
  • 允许在编译时进行错误检测。

示例:

public class myclass implements serializable {
    // implementação
}

编译时间检查:

  • 使用标记接口可以在编译过程中检测到错误。

可序列化的示例:

objectoutputstream.writeobject(myobject); // garante que myobject seja serializable

打标准确度:

  • 标记接口可以精确应用于特定的子类型。

示例:

public interface mymarkerinterface extends myspecificinterface {
    // sem métodos adicionais
}

使用示例

可序列化:

  • 表示一个类可以序列化。

示例:

public class person implements serializable {
    private string name;
    private int age;
    // getters, setters, etc.
}

将接口设置为限制标记:

  • 仅适用于collection的子类型,但不添加除collection定义之外的方法。
  • 细化了 add、equals 和 hashcode 等方法契约。
  • 与标记注释比较

书签备注:

  • 可以应用于更多的程序元素(类、接口、方法等)。

示例:

@retention(retentionpolicy.runtime)
@target(elementtype.type)
public @interface mymarkerannotation {
}

@mymarkerannotation
public class myclass {
    // implementação
}

何时使用标记接口与何时使用标记接口标记注释:

  • 使用标记界面如果:
  • 标记必须定义类型。
  • 您可能想要编写只接受带有该标记的对象的方法。

在以下情况下使用标记注释:

  • 该标签适用于类或接口以外的元素。
  • 它是大量使用注释的框架的一部分。

记号笔的优点

  • 框架的一致性:
  • 促进基于注释的框架之间的一致性。

示例:

@myframeworkannotation
public class myclass {
    // implementação
}

使用决定
定义类型:

  • 使用标记界面。
  • 标记不是类或接口的元素:
  • 使用项目符号注释。

基于注释的框架的一部分:
使用项目符号注释。

最终示例

  • 标记接口:
public interface mytypemarker {
}

public class myclass implements mytypemarker {
    // implementação
}

public void process(mytypemarker obj) {
    // processa apenas objetos marcados com mytypemarker
}

书签备注:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotationMarker {
}

@MyAnnotationMarker
public class MyClass {
    // Implementação
}

总结

  • 标记接口用于定义类型,无需额外方法。
  • 标记注释用于广泛标记程序元素。
  • 选择取决于标记的上下文和目的。