如何在Java中编写自己的标记接口?

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

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

请指导我解决此问题。

  1. 序列化由ObjectInputStreamObjectOutputStream类处理。 如果类具有特殊的序列化需求,则API中概述了要创建的方法。 reflection用于调用这些方法。

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

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

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

  • 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时,它只是告诉该类可以转换为字节。

是的我们可以创建自己的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); } } } 

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

 public interface CoolObject { } 

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

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

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

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

正如维基百科文章中所解释的那样,Java中的标记接口可以(也可能应该)替换为注释 。

标记界面没有方法。 Java具有内置的标记接口,如ClonableClonableEventListner等,可由JVM理解。

我们可以创建自己的标记接口,但它与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 Marker) { // do some task } } } 

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

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