Java冷知识:你知道什么是标记接口吗?

什么是接口

首先要明确接口的含义,接触过Java语言的同学想必已经对接口熟悉的不能再熟悉了,毕竟“接口”和“类”作为Java语言的血和肉是开发过程中不可或缺的重要组成部分。这里引用“菜鸟教程”的解释简单做下说明。

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

简而言之,“接口”是一个类具有某些能力的声明。

Java冷知识:你知道什么是标记接口吗?

什么是标记接口

接下来看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法。虽然不包含任何方法,但是这些接口也是具有某些能力的象征。

看下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.

简书上一个翻译相当贴切,这里引用下,方便大家理解

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

其实说白了就是用标记接口声明具有某种能力,这种能力是在运行时获得的,即根据一个类是否实现了标记接口来判断是否具有这种能力(反射)。

Java冷知识:你知道什么是标记接口吗?

Java中标记接口有哪些

目前看来,Java中的标记接口有Serializable、RandomAccess和Cloneable三个。在查看JDK源码或开源项目源码的时候,这些标记接口的上镜率相当之高,它们不包含任何的方法,但是却广泛的存在。

1、Serializable

Java冷知识:你知道什么是标记接口吗?

java.io.Serializable这个接口是用来标记类是否支持序列化的,所谓的序列化就是将对象(此处注意:对象,非基础数据类型)的各种信息转换成可以存储或者传输的二进制形式。如果一个类没有实现该接口,却被拿去序列化的了,那么虚拟机就会抛出不支持序列化的异常,也即:NotSerializableException。

Java冷知识:你知道什么是标记接口吗?

2、Cloneable

Java冷知识:你知道什么是标记接口吗?

Cloneable接口在深度拷贝的时候经常被用到,它的作用是标记该对象是否拥有克隆的能力。大家这里可能会感觉有一点点奇怪,众所周知Object类中本身已经有了一个方法clone(),讲道理每一个类都应该可以重写clone()方法才对,为什么还需要这样一个Cloneable标记接口呢?

Java冷知识:你知道什么是标记接口吗?

大家动动心思想一想,如果不通过标记接口这种方式,我们在平时的开发中,会采用什么方式去实现呢?

一般来说都是通过增加状态变量来达到控制(从无状态到有状态)的效果,这样或许能解决问题,但是实现方式就显得不太专业,为什么呢?Java是一门面向对象的语言,而这种方式明显与面向对象这种思想相去甚远,显得臃肿繁琐,不够优雅。

Java冷知识:你知道什么是标记接口吗?

从另外一个角度想呢,接口是一个类具有某些能力的声明,而标记接口则是在面向对象的角度来看更高级的一种抽象:即使你拥有这个方法也不行,因为你没有这个功能的标记接口,所以在调用clone()方法的过程中,如果对象没有实现Cloneable接口,那么虚拟机就会抛出一个CloneNotSupportedException异常。

3、RandomAccess

Java冷知识:你知道什么是标记接口吗?

这个接口的作用是判断集合能否快速访问,也就是通过索引下标能否快速的移动到对应的元素上。换句话说,实现这个接口的集合的底层实现上元素间在物理上(随机访问)必须是连续的。

Java冷知识:你知道什么是标记接口吗?

我们在使用某个集合类中,集合中的元素可以通过索引index下标快速的访问到,那么在该类的定义处,一般会有一个RandomAccess接口的实现标签,比如:java.util.ArrayList有这个接口,java.util.LinkedList就没有。

欢迎关注收藏

私聊获取技术干货,面试技巧,BATJ大牛一对一在线指导


分享到:


相關文章: