From fef315148d04a04e4ac2e9bbac7a7d7c31c30cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=89=E5=8B=87=E5=BC=BA2?= Date: Thu, 15 Oct 2020 14:11:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=A0=87=E8=AE=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9A=E4=B9=89=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch06枚举和注解/41.使用标记接口定义类型.md | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ch06枚举和注解/41.使用标记接口定义类型.md diff --git a/ch06枚举和注解/41.使用标记接口定义类型.md b/ch06枚举和注解/41.使用标记接口定义类型.md new file mode 100644 index 0000000..76d4890 --- /dev/null +++ b/ch06枚举和注解/41.使用标记接口定义类型.md @@ -0,0 +1,30 @@ +## 使用标记接口定义类型 + +标记接口(marker interface),不包含方法声明,只是指定(或“标记”)一个类实现了具有某些属性的接口。 + +标记接口与标记注解 +相比具有两个优点: + +- **标记接口定义了一个由标记类实例实现的类型;标记注解则不会** + + 标记接口类型的存在允许在编译时捕 + 获错误,如果使用标记注解,则直到运行时才能捕获错误。 + +- **标记接口可以更精确地定位目标** + + 如果使用目标 ElementType.TYPE 声明注解 + 类型,它可以应用于任何类或接口。 + + 假设有一个标记仅适用于特定接口的实现。 如果将其定义为标记接口,则可以 + 扩展它适用的唯一接口,保证所有标记类型也是适用的唯一接口的子类型。 + +标记注解优于标记接口的主要优点是它们是较大的注解工具的一部分。因此,标记注解允许在基于注解的框架中 +保持一致性。 + +所以什么时候应该使用标记注解,什么时候应该使用标记接口? + +显然,如果标记适用于除类或接口以外的任何程序元素,则必须使用注解,因为只能使用类和接口来实现或扩展接口。如果标记仅适用于类和接口,那么问自己问题:“可能我想编写一个或多个只接受具有此标记的对象的方法呢?”如果是这样,则应该优先使用标记接口而不是注解。这将使你可以将接口用作所讨论方法的参数类型,这将带来编译时类型检查的好处。如果你能说服自己,永远不会想写一个只接受带有标记的对象的方法,那么最好使用标记注解。另外,如果标记是大量使用注解的框架的一部分,则标记注解是明确的选择。 + +总之,标记接口和标记注释都有其用处。 如果你想定义一个没有任何关联的新方法的类型,一个标记接口是一种可行的方法。 如果要标记除类和接口以外的程序元素,或者将标记符合到已经大量使用注解类型的框架中,那么标记注解是正确的选择。 + +如果发现自己正在编写目标为 ElementType.TYPE 的标记注解类型,请花点时间确定它是否应该是注释类型,是不是标记接口是否更合适。 \ No newline at end of file