Java标记接口的作用

什么是标记接口?

        最早还是在看源码的时候有印象,例如下面是ArrayList的源码:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

实现了RandomAccess接口、Cloneable接口和Serializable接口。然而我们可以发现,这三个接口里面啥都没写,例:

public interface RandomAccess {
}

一般认为这种,没有任何方法的接口是标记接口。并不是Java的语法,而是一种设计理念。

一个关于RandomAccess的简单的例子

        RandomAccess,随机访问。简单说,就是声明了该类是否可以被随机访问。例如数组,可以通过下标访问一个具体的元素,那么这个就是可以随机访问。ArrayList的底层是数组,自然可以随机访问喽,而LinkedList底层是双向链表,自然是不能了。那么,我们在设计的时候,有这样的思想:get()方法是获取某个元素的,而List不管有多少的实现类——一定是有的将数组当底层,有的是链表,也有的用其他的数据结构。但是总而言之——能够被随机访问的数组,我们可以通过下标直接获取元素,而其他的只能通过遍历来获取。

        我们化简一下,假设只有ArrayList和LinkedList,然后在写AbstractList中get方法,可以这样:

package me.iwts;

interface RandomAccess {

}

class AbstractList {
    public void get(int index) {
         if(this instanceof RandomAccess) {
             System.out.println("random");
         }else{
             System.out.println("no");
         }
    }
}

class ArrayList extends AbstractList implements RandomAccess {

}

class LinkedList extends AbstractList {

}

public class Main {
    public static void main(String[] args){
        ArrayList list = new ArrayList();
        LinkedList list1 = new LinkedList();
        list.get(1);
        list1.get(1);
    }
}

可能看完上面的代码,已经能够理解什么是标记接口了。

        利用多态,将get()方法的实现在父类中写,子类只用使用就行了。而RandomAccess仅仅是一个标记——标记该类是用数组的,可以被随机访问。自然,实现这样的写法,用继承太蛋疼了,用接口就非常方便。

Java 中,使用一个接口来给一个类打上某种标记接口被称为标记接口(Marker Interface),也称为标识接口标记接口是一种非常简单但又非常有用的技术,它允许程序员在不增加任何方法的情况下,为某个类或对象打上标记,以便在程序运行时识别出它们的特定属性或行为。 标记接口没有任何方法定义,它只是一个空接口,例如: ```java public interface MyMarkerInterface { // 这个接口没有任何方法定义 } ``` 在程序中使用标记接口时,只需要让需要被标记的类实现这个接口即可,例如: ```java public class MyClass implements MyMarkerInterface { // MyClass 实现了 MyMarkerInterface 接口 } ``` 在程序中,可以通过 instanceof 关键字来判断某个对象是否实现了某个标记接口,例如: ```java if (myObject instanceof MyMarkerInterface) { // myObject 实现了 MyMarkerInterface 接口 } ``` 标记接口的主要作用是为了让程序员在运行时识别出某个类或对象的特定属性或行为,它通常用于以下几种情况: 1. 序列化:Java 中的序列化机制要求被序列化的类必须实现 java.io.Serializable 接口,这个接口就是一个标记接口,它没有任何方法,只是用来标记一个类可以被序列化。 2. 标识某个对象的属性:例如,java.rmi.Remote 接口就是一个标记接口,它用来标识某个对象是可远程调用的。 3. 简化代码:标记接口可以作为一种简化代码的方式,用来代替标记类。例如,可以定义一个 EmptyMarker 接口,用来标记某些对象为空,而不是定义一个专门的 EmptyMarker 类。 需要注意的是,标记接口虽然没有任何方法定义,但是它的存在本身就有一定的意义,因此在定义标记接口时需要仔细考虑其含义和用途,避免滥用标记接口造成代码混乱。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值