如何在Java中编写自己的标记界面?

时间:2012-06-13 03:59:23

标签: java oop interface

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

  1. JVM如何调用此特定行为?
  2. 如何编写我们自己的标记界面?你能给我一个简单的用户定义标记界面供我理解吗?
  3. 是否可以在标记界面中使用方法?
  4. 请指导我解决此问题。

6 个答案:

答案 0 :(得分:26)

  • JVM如何调用此特定行为

ObjectOutputStreamObjectInputStream会检查您的班级是否实施SerializableExternalizable。如果是,它将继续,否则将抛出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);
}
  • 这可能在标记界面中有方法吗?

Marker Interface Pattern的整个想法是提供一个方法来说“是的我是某种东西”然后系统将继续默认过程,就像你将你的类标记为Serialzable时它只是告诉这个类可以被转换为字节。

答案 1 :(得分:14)

  1. 序列化由ObjectInputStreamObjectOutputStream类处理。如果某个类具有特殊的序列化需求,则创建的方法将在API中列出。反射用于调用这些方法。

  2. 与编写任何其他界面的方式相同。

  3. 没有什么可以阻止你将方法放在标记界面中。

  4. 现在更常见的做法是使用annotations来提供相同的元数据标记接口。

答案 2 :(得分:5)

是的我们可以创建自己的Marker界面。请参阅以下内容......

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);
        }


    }

}

答案 3 :(得分:3)

标记界面没有方法。 Java具有内置标记接口,如SerializableClonable& JVM理解的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
            }
        }
    }
    

答案 4 :(得分:2)

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

public interface CoolObject {
}

然后代码可以测试对象是否为CoolObject并对其执行某些操作:

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

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

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

正如维基百科文章所述,Java中的标记接口可以(也可能应该)替换为annotations

答案 5 :(得分:0)

据我所知,标记接口通过“实用程序”类获取其行为。例如,如果您已经阅读了Gang of Four的“设计模式”一书,那么您的行为标记了另一个类中定义的标记接口。

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