如何在Java中编写自己的标记接口?
我知道java中的标记界面。 它用于定义关于类的特定行为。 例如,Serializable接口具有将对象存储到字节流及其反向过程的特定function。 但我不知道这个特定行为的实现位置,因为它没有任何方法。
- JVM如何调用此特定行为?
- 如何编写我们自己的标记界面? 你能给我一个简单的用户定义标记界面供我理解吗?
- 是否可以在标记界面中使用方法?
请指导我解决此问题。
-
序列化由
ObjectInputStream
和ObjectOutputStream
类处理。 如果类具有特殊的序列化需求,则API中概述了要创建的方法。 reflection用于调用这些方法。 -
与编写任何其他界面的方式相同。
-
没有什么能阻止你将方法放在标记界面中。
现在更常见的做法是使用注释来提供相同的元数据标记接口。
- 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); }
- 这可能在标记界面中有方法吗?
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具有内置的标记接口,如Clonable
, Clonable
和EventListner
等,可由JVM理解。
我们可以创建自己的标记接口,但它与JVM无关,我们可以使用instanceOf
添加一些检查。
-
创建空接口
interface Marker{ }
-
编写一个类并实现该接口
class A implements Marker { //do some task }
-
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),然后在其上保存操作。