我知道java中的标记界面。它用于定义关于类的特定行为。例如,Serializable接口具有将对象存储到字节流及其反向过程的特定功能。但我不知道这个特定行为的实现位置,因为它没有任何方法。
请指导我解决此问题。
答案 0 :(得分:26)
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时它只是告诉这个类可以被转换为字节。
答案 1 :(得分:14)
序列化由ObjectInputStream
和ObjectOutputStream
类处理。如果某个类具有特殊的序列化需求,则创建的方法将在API中列出。反射用于调用这些方法。
与编写任何其他界面的方式相同。
没有什么可以阻止你将方法放在标记界面中。
现在更常见的做法是使用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具有内置标记接口,如Serializable
,Clonable
& JVM理解的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
}
}
}
答案 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的“设计模式”一书,那么您的行为标记了另一个类中定义的标记接口。
例如,您有一个标记界面“可保存”。您有一个进程遍历实现此接口的所有类(通过反射),然后在其上保存操作。