`
JerryWang_SAP
  • 浏览: 1030558 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

什么是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异常。

 

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

 

 
 
0
0
分享到:
评论

相关推荐

    java @interface 注解详解及实例

    在 Java 中,定义注解其实和定义接口差不多,只需要在 interface 前添加一个 @ 符号就可以,即 `@interface Zhujie{ }`,这就表明我们定义了一个名为 `@Zhujie` 的注解。注解中的每一个方法定义了这个注解类型的一个...

    java 术语 a-z

    22. **标记接口 (marker interface)**:没有方法的接口,仅作为标记,表明实现它的类具有某种特性。 这些术语构成了Java编程的基础,理解并熟练应用它们对于成为专业的Java开发者至关重要。在实际编程中,掌握这些...

    Java 注释编码

    Java中的注解分为三种主要类型:标记注解(Marker Annotations)、单值注解(Single Value Annotations)和完整注解(Full Annotations)。标记注解类似于标记接口,只包含注解名称;单值注解和完整注解则可以包含一...

    java_注解作用java_注解作用.doc

    1. 标记注释(Marker Annotation):只有名称标识,没有变量。例如 `@annotation`。 2. 单一值注释(Single-Value Annotation):在标记注释的基础上提供一段数据。例如 `@annotation("data")`。 3. 完整注释(Full ...

    Google Map Api 调用样例程序(Java版)

    3. **位置标记**:Java代码可能包含方法来创建和管理`Marker`对象,这些对象表示地图上的特定点。通过设置坐标和图标,我们可以在地图上画点。 4. **路径绘制**:如果描述中的"画线"是指绘制路径,那么Java代码可能...

    Java语言的接口与类型安全

    1. **定义**:Java接口是一组未实现的方法声明,它定义了一组公共行为的标准,允许不同的类实现这些接口以提供不同的实现方式。接口在Java中扮演着契约的角色,确保所有实现接口的类都遵循相同的规范。 2. **接口的...

    北京圣思园 Annotation pdf文档

    在Java 5.0版本发布之前,程序员通常需要使用注释(Comments)或者标记接口(Marker Interfaces)来提供关于程序的额外信息。然而,注释对编译器来说是透明的,并不会被Java虚拟机(JVM)所识别。标记接口则需要为...

    Java术语表[借鉴].pdf

    18. **标记注解(Marker Annotation)**:没有元数据的注解,仅表示注解的存在。 19. **命名惯例(Naming Convention)**:为了代码可读性,遵循的一系列命名规则,例如首字母大写的类名,下划线分隔的变量名等。 ...

    标记

    3. **标记接口(Marker Interface)**:这种类型的接口没有声明任何方法,仅仅作为一个标记,表明实现了该接口的类具有某种特性。例如,`java.io.Serializable`接口就是一种标记接口,表示对象可以被序列化。 4. **...

    Java.Annotation

    例如,在过去,为了创建Web服务,开发者需要手动编写接口和实现,而现在,通过Annotation,这些模板代码可以由工具自动生成。同样,像EJB这样的技术以前需要部署描述符文件,现在可以通过Annotation在代码中直接指定...

    java注解详解

    1. 标记注解(Marker Annotation):仅仅存在于源码中,不会被编译到 class 文件中。 2. 文档注解(Documented Annotation):将被包含在 javadoc 中。 3. 元注解(Meta Annotation):用于定义注解的保留策略、作用...

    Pattens In Java.pdf

    标记接口是一种特殊的接口类型,它没有任何方法声明。它主要用于表示某种特性或分类。 **结构:** - **标记接口**:仅声明接口,不包含任何方法。 - **实现类**:实现该接口,不需要实现任何方法。 **适用场景:**...

    annotation手册

    - **示例**:`@Override` 就是一个 Marker Annotation,用于标记一个方法是覆盖父类的方法。 ##### 3. **Single-Element Annotation** - **定义**:当一个 Annotation 只有一个成员变量时,可以省略 name,默认名为...

    jboss-logging-3.3.0.Final.jar源码

    `org.jboss.logging`包主要包含了各种辅助工具和适配器,如`BasicLogger`是所有日志实现的基础,`Marker`接口用于标记特定的日志事件,而`MessageFormatter`和`Parameters`类则用于格式化和解析日志消息。...

    Java注解详细介绍

    - **标记注解(Marker Annotation)**:不包含任何元素的注解,只作为一个标识存在,例如`@Override`。 - **单元素注解(Single-Element Annotation)**:只有一个元素的注解,如`@Deprecated(message = "Use new ...

    高德地图开发简单demo

    使用Android SDK时,我们需要在Android Studio项目中导入高德地图的SDK库,并在Java或Kotlin代码中调用相关接口。 3. **iOS SDK**:针对iOS平台,提供类似的功能,让开发者能在Swift或Objective-C中使用。集成过程...

Global site tag (gtag.js) - Google Analytics