博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是Java Marker Interface(标记接口)
阅读量:6094 次
发布时间:2019-06-20

本文共 1792 字,大约阅读时间需要 5 分钟。

hot3.png

先看看什么是标记接口?标记接口有时也叫标签接口(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异常。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

转载于:https://my.oschina.net/u/3771578/blog/2249800

你可能感兴趣的文章
解决zabbix 3.0中1151端口不能运行问题
查看>>
计算机如何启动(How Computers Boot Up)
查看>>
*新建的普通用户添加到sudoers
查看>>
责任链模式/Chain Of Responsibility
查看>>
超人学院实力承诺
查看>>
ruby on rails 命令行下看效果
查看>>
.NET 4 并行(多核)编程系列之四 Task的休眠
查看>>
走向.NET架构设计—第四章—业务层分层架构(前篇)
查看>>
我的友情链接
查看>>
asp.net开发3层架构 每一层作用
查看>>
基于模型开发 Back-to-Back测试统合工具-MC-Verifier
查看>>
如何使用UML(统一建模语言)画PHP类图
查看>>
execl打开linux下cvs文件乱码问题解决办法
查看>>
android当前正在运行的应用包名
查看>>
转:电源滤波电路、整流电源滤波电路分析
查看>>
我的友情链接
查看>>
Hadoop集群搭建的无密登录配置
查看>>
angular使directive让div contenteditable & ng-model生效
查看>>
制作CentOS 6.4 U盘启动安装盘
查看>>
Java try、catch、finally及finally执行顺序详解
查看>>