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

news/2024/7/7 19:29:56

2019独角兽企业重金招聘Python工程师标准>>> 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


http://www.niftyadmin.cn/n/3778344.html

相关文章

JavaWeb项目架构之Kafka分布式日志队列

架构、分布式、日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了。 kafka介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布…

ionic 签名、打包

ionic cordova platform add androidionic cordova build android 【debug版本,无需签名】 ionic cordova build android --release 【发布版,需要签名(要使用jarsigner签名必须用release版本)】 ionic cordova build android --r…

Spring框架内容整理(三):AOP

2019独角兽企业重金招聘Python工程师标准>>> AOP面向切面 切面支持类 切面就是通知和切入点的组合,而切面是通过配置方式定义的,因此这定义切面前,我们需要定义切面支持类,切面支持类提供了通知实现 package cn.javass…

python并发编程之多进程理论

一、什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 举例:单核多道,实现多个进程的并发执行你在一个时间段内有很多任务要做:写python程序,打游戏,逛淘宝  但你同一时刻只能…

python堆排序

堆排序介绍 堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。 堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系…

005-统一沟通-部署-基础-环境

准备Active Directory 和域(031-Mail01)安装完成(031-Mail01)为邮箱服务器创建DNS记录(011-DC01)验证DNS邮箱服务器安装证书(031-Mail01)前端服务器验证林准备和域(011-DC01)前端服务器DNS验证(…

Shiro整合springboot,freemaker,redis

为什么80%的码农都做不了架构师?>>> 一、导语 今天推荐给大家一个非常简单,实用的开源权限框架:Shiro,这也是Java官方推荐的权限框架。 尽管网上有很多类似的文章,但是都不够完善,尤其是涉及到…

微软超融合私有云测试32-SCCM2016部署之SCCM管理服务器安装

1) 前置条件安装完毕后,插入SCCM安装光盘,打开安装光盘的如下路径下的extadsh.exe程序并执行,(注意: 一定要从CMD中执行,并且使用管理员模式)\SMSSETUP\BIN\X642) 执行成…