Как написать собственный интерфейс маркера в 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
.
-
Создать пустой интерфейс
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
}
}
}
Ответ 5
Как объяснено очень хорошо в статье Википедии Шаблон интерфейса маркера, интерфейс маркера является формой метаданных. Клиентский код может проверить, является ли объект экземпляром интерфейса маркера и соответствующим образом адаптирует его (поведение клиента). Здесь интерфейс маркера:
public interface CoolObject {
}
Затем код может проверить, является ли объект CoolObject
и что-то с ним делать:
if (anObject instanceof CoolObject) {
addToCoolList((CoolObject) anObject);
}
Интерфейс Serializable
определяется как часть языка Java. Вы не можете реализовать поведение на этом уровне самостоятельно.
Вы можете добавлять методы к интерфейсу маркера, но это смешивает шаблон маркера с другими концептуальными использованиями для интерфейсов и может вводить в заблуждение. (Является ли класс, реализующий интерфейс, для его маркировки или для его поведения или для обоих?)
Как поясняется в статье в Википедии, интерфейсы маркеров в Java могут (и, вероятно, должны) быть заменены на annotations.
Ответ 6
Насколько я знаю, интерфейсы маркеров получают свое поведение классами "полезности". Например, если вы прочитали книгу Design Patterns группой Gang of Four, у вас есть поведение класса, помеченного с помощью интерфейса маркера, определенного в другом классе.
Например, у вас есть интерфейс маркера "Saveable". У вас есть процесс, который проходит все классы, реализующие этот интерфейс (через отражение), а затем сохраняет операцию на нем.