专栏首页Jerry的SAP技术分享什么是Java Marker Interface(标记接口)

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

先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法。在Java里很容易找到标记接口的例子,比如JDK里的Serializable接口就是一个标记接口。

首先明确一点,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。

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

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

JDK源代码里的Clone方法的注释也清晰注明了,如果一个类没有实现Cloneable接口,在执行clone方法时会抛出CloneNotSupportedException异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法。在Java里很容易找到标记接口的例子,比如JDK里的Seri...

    Jerry Wang
  • orgman set触发的pricing set创建逻辑

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang
  • CRM WebClient UI里标准configuration和custom configuration区别

    猜想: q system上创建的configuration 一定是customer configuration。

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

    先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法。在Java里很容易找到标记接口的例子,比如JDK里的Seri...

    Jerry Wang
  • 深入理解Spring-之-源码剖析AOP(注解方式一)

    上一篇文章我们从XML 配置文件的方式剖析了AOP的源码,我们也说了,虽然现在用XML配置的几乎没有了,但作为学习的例子,XML配置仍然是我们理解Spring ...

    用户5224393
  • java中接口的作用

    很多JAVA初级程序员对于接口存在的意义很疑惑。不知道接口到底是有什么作用,为什么要定义接口。       好像定义接口是提前做了个多余的工作。下面我给大家总结...

    用户1220053
  • 微信公众平台数据接口开始内测

    微信公众平台每天的数据量越来越庞大了,新年红包再次延迟逐显服务器压力,微信也慢慢开放一些接口给第三方平台,这不,今天微信公众平台数据接口开始公测了。微信公众平台...

    ytkah
  • Java-嵌套接口

    嵌套接口可以被称为 inner interface,也可以称为 nested class。

    Fisherman渔夫
  • Winform调用视频流媒体服务器HTTP接口实现客户端播放请求流程

    因为每个开发者的开发环境不同,因此需求也都不同,有的开发者对二次开发比较感兴趣,那么几个关键的接口就一定要知道并且懂得如何使用。每次我收到并且为大家解决一些新问...

    EasyNVR
  • SSM的疑难杂症--持续更新

    单例bean存在线程安全问题,当多线程操作成员变量时会有冲突发生,如果定义在方法入参处那样在栈中则不会。避免使用成员变量或推荐使用ThreadLocal成员变量...

    Howl

扫码关注云+社区

领取腾讯云代金券