什么是Java Marker Interface(标记接口)

简介: 什么是Java Marker Interface(标记接口)

image.png

首先明确一点,Marker Interface(标记接口)决不是Java这门编程语言特有的,而是计算机科学中一种通用的设计理念。


我们看Wikipedia里对标记接口的定义。


“The tag/ marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata.“


我试了下Google Translate翻译上面这段话,翻得很差劲,所以我来解释一下。


标记接口是计算机科学中的一种设计思路。编程语言本身不支持为类维护元数据。而标记接口则弥补了这个功能上的缺失——一个类实现某个没有任何方法的标记接口,实际上标记接口从某种意义上说就成为了这个类的元数据之一。运行时,通过编程语言的反射机制,我们就可以在代码里拿到这种元数据。


以Serializable接口为例。一个类实现了这个接口,说明它可以被序列化。因此,我们实际上通过Serializable这个接口,给该类标记了“可被序列化”的元数据,打上了“可被序列化”的标签。这也是标记/标签接口名字的由来。


下面的代码是我从JDK源代码中摘出来的:

if (obj instanceof String) {
  writeString((String) obj, unshared);
} else if (cl.isArray()) {
  writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
  writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {
  writeOrdinaryObject(obj, desc, unshared);
} else {
  if (extendedDebugInfo) {
    throw new NotSerializableException(cl.getName() + " "
    + debugInfoStack.toString());
  } else {
    throw new NotSerializableException(cl.getName());
  }
}

Java里的序列化,字符串,数组,枚举类和普通类是分别进行的。如果当前待序列化的变量既不是字符串,也不是数组和枚举类,那么就检测该类是否实现了Serializable的接口,大家注意下图第1177行就执行了这种检测。如果没有实现Serializable接口,就会抛出异常NotSerializableException。

image.png

大家也许会问,在Spring里满天飞的注解(Annotation)不是最好的用来维护元数据的方式么?确实,Annotation能声明在Java包、类、字段、方法、局部变量、方法参数等的前面用于维护元数据的目的,既灵活又方便。然而这么好的东西,只有在JDK1.5之后才能用。JDK1.5之前维护元数据的重任就落在标记接口上了。


大家看另一个标记接口,Cloneable。下图第51行清晰标注了该接口从JDK1.0起就有了。


image.png


相关文章
|
28天前
|
Java
【Java】一个简单的接口例子(帮助理解接口+多态)
【Java】一个简单的接口例子(帮助理解接口+多态)
16 0
C4.
|
1月前
|
Java
Java的接口
Java的接口
C4.
19 0
|
1月前
|
Java
JAVA接口
JAVA接口
12 0
|
1天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
5 0
Java接口中可以定义哪些方法?
|
3天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
15 0
|
7天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
25 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
9天前
|
存储 Java
java接口和内部类
java接口和内部类
|
11天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function<T, R>`用于转换操作,`Predicate<T>`用于布尔判断,`Consumer<T>`用于消费输入,`Supplier<T>`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
26 0
|
11天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
34 0
|
12天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
20 4