我知道java中的标记接口。它用于定义有关类的特定行为。例如,Serializable 接口具有将对象存储为字节流及其反向过程的特定能力。但是我不知道这个特定的行为是在哪里实现的,因为它里面没有任何方法。
- 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 时,它只是告诉这个类可以转换为字节。
序列化由ObjectInputStream
和ObjectOutputStream
类处理。如果一个类有特殊的序列化需求, API中列出了创建方法。反射用于调用这些方法。
与编写任何其他接口的方式相同。
没有什么能阻止您将方法放入标记接口中。
现在更常见的做法是使用注释来提供与元数据标记接口相同的功能。
是的,我们可以创建自己的标记界面..请参阅以下...
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);
}
}
}
标记接口没有方法。Java具有JVM可以理解的内置标记接口,如Serializable
,Clonable
&等。EventListner
我们可以创建自己的标记接口,但它与 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 A) {
// do some task
}
}
}
正如 Wikipedia 文章Marker interface pattern中很好地解释的那样,marker interface 是元数据的一种形式。客户端代码可以测试一个对象是否是标记接口的一个实例,并相应地调整它的(客户端的)行为。这是一个标记界面:
public interface CoolObject {
}
然后代码可以测试一个对象是否是 aCoolObject
并用它做一些事情:
if (anObject instanceof CoolObject) {
addToCoolList((CoolObject) anObject);
}
该Serializable
接口被定义为 Java 语言的一部分。您自己无法实现该级别的行为。
您可以将方法添加到标记接口,但这会将标记模式与接口的其他概念用途混合在一起,并且可能会造成混淆。(一个实现接口的类是为了标记它,还是为了它的行为,或两者兼而有之?)
正如 Wikipedia 文章中所解释的,Java 中的标记接口可以(并且可能应该)替换为annotations。
据我所知,标记接口通过“实用程序”类获得它们的行为。例如,如果您阅读了四人组的设计模式书,您就会知道一个类的行为是用另一个类中定义的标记接口标记的。
例如,您有一个标记界面“可保存”。您有一个遍历所有实现此接口的类(通过反射)的过程,然后对其进行保存操作。