有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

oop如何用Java编写我们自己的标记接口?

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

  1. JVM如何调用这种特定行为
  2. 如何编写我们自己的标记接口?你能给我一个简单的用户定义的标记界面让我理解吗
  3. 在marker接口中可以有方法吗

请指导我解决这个问题


共 (6) 个答案

  1. # 1 楼答案

    • 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接口中有方法吗

    {a1}的整个思想是提供一种表示“是的,我是某样东西”的方法,然后系统将继续默认过程,比如当您将类标记为可序列化时,它只告诉您该类可以转换为字节

  2. # 2 楼答案

    标记接口没有方法。Java有内置的标记接口,如SerializableClonable&EventListner等,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 A) {
                  // do some task
              }
          }
      }
      
  3. # 3 楼答案

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

    public interface CoolObject {
    }
    

    然后,代码可以测试对象是否为CoolObject,并对其进行处理:

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

    Serializable接口被定义为Java语言的一部分。您不能自己实现该级别的行为

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

    正如Wikipedia文章中所解释的,Java中的标记接口可以(也可能应该)替换为annotations

  4. # 4 楼答案

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

    2. 与编写任何其他接口的方式相同

    3. 没有什么能阻止您将方法放入标记接口中

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

  5. # 5 楼答案

    据我所知,标记接口通过“实用程序”类获得其行为。例如,如果您阅读过四人帮的《设计模式》一书,您就会看到一个类的行为,该类使用另一个类中定义的标记接口进行标记

    例如,您有一个标记接口“Saveable”。您有一个进程,该进程遍历实现该接口的所有类(通过反射),然后对其执行保存操作

  6. # 6 楼答案

    是的,我们可以创建自己的标记接口。。请看下面的一个

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