Как написать собственный интерфейс маркера в Java?

Я знаю интерфейс маркера в java. Он используется для определения конкретного поведения в классе. Например, интерфейс Serializable обладает специфической способностью хранить объект в потоке байтов и его обратном процессе. Но я не знаю, где это конкретное поведение реализовано, потому что в нем нет никакого метода.

  • Как JVM вызывает это конкретное поведение?
  • Как написать собственный интерфейс маркера? Можете ли вы дать мне простой пользовательский интерфейс маркера для моего понимания?
  • Возможно ли иметь методы в интерфейсе маркера?

Пожалуйста, помогите мне решить эту проблему.

Ответ 1

  • Сериализация осуществляется классами ObjectInputStream и ObjectOutputStream. Если класс имеет специальные требования к сериализации, методы для создания описываются в API. Отражение используется для вызова этих методов.

  • Точно так же вы можете написать любой другой интерфейс.

  • Там ничего не мешает вам вводить методы в интерфейс маркера.

В настоящее время более распространенной практикой является использование annotations для обеспечения того же самого интерфейса маркеров метаданных.

Ответ 2

  • Как 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, он просто сообщает, что этот класс может быть преобразован в байты.

Ответ 3

Да Мы можем создать собственный интерфейс маркера. Смотрите следующий...

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


    }

}

Ответ 4

Маркерный интерфейс не имеет метода. Java имеет встроенный маркерный интерфейс, такой как Serializable, Clonable & EventListner т.д., 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
            }
        }
    }
    

Ответ 5

Как объяснено очень хорошо в статье Википедии Шаблон интерфейса маркера, интерфейс маркера является формой метаданных. Клиентский код может проверить, является ли объект экземпляром интерфейса маркера и соответствующим образом адаптирует его (поведение клиента). Здесь интерфейс маркера:

public interface CoolObject {
}

Затем код может проверить, является ли объект CoolObject и что-то с ним делать:

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

Интерфейс Serializable определяется как часть языка Java. Вы не можете реализовать поведение на этом уровне самостоятельно.

Вы можете добавлять методы к интерфейсу маркера, но это смешивает шаблон маркера с другими концептуальными использованиями для интерфейсов и может вводить в заблуждение. (Является ли класс, реализующий интерфейс, для его маркировки или для его поведения или для обоих?)

Как поясняется в статье в Википедии, интерфейсы маркеров в Java могут (и, вероятно, должны) быть заменены на annotations.

Ответ 6

Насколько я знаю, интерфейсы маркеров получают свое поведение классами "полезности". Например, если вы прочитали книгу Design Patterns группой Gang of Four, у вас есть поведение класса, помеченного с помощью интерфейса маркера, определенного в другом классе.

Например, у вас есть интерфейс маркера "Saveable". У вас есть процесс, который проходит все классы, реализующие этот интерфейс (через отражение), а затем сохраняет операцию на нем.