19

我知道java中的标记接口。它用于定义有关类的特定行为。例如,Serializable 接口具有将对象存储为字节流及其反向过程的特定能力。但是我不知道这个特定的行为是在哪里实现的,因为它里面没有任何方法。

  1. JVM 如何调用这个特定的行为?
  2. 如何编写我们自己的标记接口?你能给我一个简单的用户定义的标记界面供我理解吗?
  3. 标记接口中是否可以有方法?

请指导我解决此问题。

4

6 回答 6

37
  • JVM 如何调用此特定行为

ObjectOutputStream并将ObjectInputStream检查您的课程是否实现Serializable, Externalizable. 如果是,它将继续,否则将抛出NonSerializableException

  • 如何编写我们自己的标记接口

创建一个没有任何方法的接口,这就是你的标记接口。

样本

public interface IMarkerEntity {


}

如果任何实现此接口的类将被您的应用程序视为数据库实体。

示例代码:

public boolean save(Object object) throws InvalidEntityException {
   if(!(object instanceof IMarkerEntity)) {
       throw new InvalidEntityException("Invalid Entity Found, cannot proceed");
   } 
   database.save(object);
}
  • 这可能在标记接口中有方法吗?

标记接口模式的整个想法是提供一种说“是的,我是某物”的意思,然后系统将继续执行默认过程,就像当你将你的类标记为 Serialzable 时,它​​只是告诉这个类可以转换为字节。

于 2012-06-13T04:11:14.153 回答
15
  1. 序列化由ObjectInputStreamObjectOutputStream类处理。如果一个类有特殊的序列化需求, API中列出了创建方法。反射用于调用这些方法。

  2. 与编写任何其他接口的方式相同。

  3. 没有什么能阻止您将方法放入标记接口中。

现在更常见的做法是使用注释来提供与元数据标记接口相同的功能。

于 2012-06-13T04:08:33.537 回答
7

是的,我们可以创建自己的标记界面..请参阅以下...

interface Marker{   
}

class MyException extends Exception {   
    public MyException(String s){
        super(s);
    }
}

class A  {
    void m1() throws MyException{        
         if((this instanceof Marker)){
             System.out.println("successfull");
         }
         else {
             throw new MyException("Must implement interface Marker ");
         }      
    }   
}

public class CustomMarkerInterfaceExample  extends A implements Marker
{ // if this class will not implement Marker, throw exception
    public static void main(String[] args)  {
        CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample();
        try {
            a.m1();
        } catch (MyException e) {

            System.out.println(e);
        }


    }

}
于 2014-03-02T10:24:12.337 回答
3

标记接口没有方法。Java具有JVM可以理解的内置标记接口,如SerializableClonable&等。EventListner

我们可以创建自己的标记接口,但它与 JVM 无关,我们可以添加一些检查instanceOf

  1. 创建空接口

    interface Marker{    }
    
  2. 编写一个类并实现接口

    class A implements Marker {
        //do some task
    }
    
  3. Main检查标记接口的类instanceof

    class Main {
        public static void main(String[] args) {
            A ob = new A(){
            if (ob instanceof A) {
                // do some task
            }
        }
    }
    
于 2016-02-08T20:03:55.070 回答
2

正如 Wikipedia 文章Marker interface pattern中很好地解释的那样,marker interface 是元数据的一种形式。客户端代码可以测试一个对象是否是标记接口的一个实例,并相应地调整它的(客户端的)行为。这是一个标记界面:

public interface CoolObject {
}

然后代码可以测试一个对象是否是 aCoolObject并用它做一些事情:

if (anObject instanceof CoolObject) {
    addToCoolList((CoolObject) anObject);
}

Serializable接口被定义为 Java 语言的一部分。您自己无法实现该级别的行为。

您可以将方法添加到标记接口,但这会将标记模式与接口的其他概念用途混合在一起,并且可能会造成混淆。(一个实现接口的类是为了标记它,还是为了它的行为,或两者兼而有之?)

正如 Wikipedia 文章中所解释的,Java 中的标记接口可以(并且可能应该)替换为annotations

于 2012-06-13T04:09:57.800 回答
0

据我所知,标记接口通过“实用程序”类获得它们的行为。例如,如果您阅读了四人组的设计模式书,您就会知道一个类的行为是用另一个类中定义的标记接口标记的。

例如,您有一个标记界面“可保存”。您有一个遍历所有实现此接口的类(通过反射)的过程,然后对其进行保存操作。

于 2012-06-13T04:09:18.853 回答