先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法。

在Java里很容易找到标记接口的例子,比如JDK里的Serializable接口就是一个标记接口。

public interface 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这个接口,给该类标记了“可被序列化”的元数据,打上了“可被序列化”的标签。这也是标记/标签接口名字的由来。
Java里的序列化,字符串,数组,枚举类和普通类是分别进行的。如果当前待序列化的变量既不是字符串,也不是数组和枚举类,那么就检测该类是否实现了Serializable的接口,大家注意下图第1177行就执行了这种检测。如果没有实现Serializable接口,就会抛出异常NotSerializableException。
大家也许会问,在Spring里满天飞的注解(Annotation)不是最好的用来维护元数据的方式么?确实,Annotation能声明在Java包、类、字段、方法、局部变量、方法参数等的前面用于维护元数据的目的,既灵活又方便。然而这么好的东西,只有在JDK1.5之后才能用。JDK1.5之前维护元数据的重任就落在标记接口上了。

大家看另一个标记接口,Cloneable。下图第51行清晰标注了该接口从JDK1.0起就有了。
JDK源代码里的Clone方法的注释也清晰注明了,如果一个类没有实现Cloneable接口,在执行clone方法时会抛出CloneNotSupportedException异常。

Java Marker Interface的更多相关文章

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

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

  2. 谨慎使用Marker Interface

    之所以写这篇文章,源自于组内的一些技术讨论.实际上,Effective Java的Item 37已经详细地讨论了Marker Interface.但是从整个Item的角度来看,其对于Marker In ...

  3. Java Native Interface 六JNI中的异常

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...

  4. Java Native Interface 五 JNI里的多线程与JNI方法的注册

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...

  5. Java Native Interface 四--JNI中引用类型

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...

  6. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...

  7. Java Native Interface 编程系列一

    本文是<Java Native Interface Programmer's Guide and Specification>的读书笔记 Java Native Interface可以让编 ...

  8. Java注释@interface的用法【转】

    Java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类.@Override,@Deprecated,@SuppressWarnings为 ...

  9. Java注释@interface的用法

    转---------- java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类.@Override,@Deprecated,@Suppr ...

随机推荐

  1. MS SQL Server的LTRIM,RTRIM和TRIM函数

    在MS SQL Server 2017有了一个新函数TRIM,整合以前版本LTRIM和RTRIM. 这几个函数都是去除字符串头部后尾部的空格. DECLARE @str NVARCHAR(MAX) = ...

  2. PHP正则表达式,看这一篇就够啦!

    前言 不知道你们有没有这个感觉,看正则表达式就像看天文数字一样,什么电话号码.邮箱的正则表达式,上网复制一下粘贴下来就搞定了.完全不知道这写的是什么玩意.后来我自己也想学一下,因为感觉用处还是挺大的. ...

  3. 【JOI Camp 2015】IOIO卡片占卜——最短路

    题目 [题目描述]K 理事长是占卜好手,他精通各种形式的占卜.今天,他要用正面写着 `I` ,背面写着 `O` 的卡片占卜一下日本 IOI 国家队的选手选择情况.占卜的方法如下:1. 首先,选取五个正 ...

  4. uoj#37. 【清华集训2014】主旋律(状压dp+容斥)

    传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...

  5. [Xcode 实际操作]七、文件与数据-(4 )遍历文件夹中的文件

    目录:[Swift]Xcode实际操作 本文将演示如何遍历文件夹下的内容. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  6. c#根据身份证获取身份证信息

    /// <summary> /// 根据身份证获取身份证信息 /// 18位身份证 /// 0地区代码(1~6位,其中1.2位数为各省级政府的代码,3.4位数为地.市级政府的代码,5.6位 ...

  7. node学习(2)-路由读取图片

    通常我们开发项目的时候都要用到图片,那么nodejs是如何读取图片的呢? 我们来看一下,因为一个网页中图片的数量是不确定的,而我们不能每一张图片都去写它的src路径,这时候最好的方法就是写一个专门读取 ...

  8. docker镜像创建

    1. 首选要创建一个Dockerfile文件,内容如下: FROM alpine:latest MAINTAINER  lobin <lobin.hotmail.com> RUN apk ...

  9. 从两个不同的ServiceProvider说起

    从两个不同的ServiceProvider说起 我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管 ...

  10. Django 的一些错误以及处理

    django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 589: 'static', expected 'e ...