2014-01-24 3 views
1

Я думал об этом, но не мог отбросить его сразу, почему мы даже реализуем интерфейсы Marker для нашего класса, даже если они не содержат никаких методов. Пожалуйста, дайте мне знатьПочему мы реализуем интерфейс маркеров, даже если они не содержат каких-либо методов?

+0

Thanks Anjan, проверит его со следующего. – Nani

+0

@Nani stackoverflow имеет очень мощную [поисковую систему] (http://stackoverflow.com/search?q=%5Bjava%5D+marker+interface). – assylias

+0

@assylias спасибо. – Nani

ответ

0

Для обвинителя. так же, как: Интерфейс A, орудие B. обычно используется A. В весеннем каркасе это знакомо

3

Давайте возьмем пример: Сериализуемый.

Если вы попытаетесь сериализовать объект, механизм сериализации Java будет генерировать исключение, если ваш объект не является экземпляром Serializable. Чтобы сделать его экземпляром Serializable, класс объекта должен реализовать интерфейс Serializable, даже если этот интерфейс не содержит никакого метода. Только так, что

o instanceof Serializable 

является верным, а не ложным.

0

Интерфейс маркера используется в качестве тега для сообщения сообщения в java-компиляторе, чтобы он мог добавлять особое поведение к классу, реализующему его.

Внимательно изучите интерфейс маркера в Java, например. Serializable, Clonnable и Remote выглядит так, что они используются для указания компилятора или JVM. Поэтому, если JVM видит, что класс Serializable, он сделал некоторую специальную операцию на нем, аналогично, если JVM видит, что один класс реализует Clonnable, он выполняет некоторую операцию для поддержки клонирования.

+0

Нет, компилятор не заботится об этом и не добавляет никакого bhavior в класс, реализующий интерфейс маркера. –

3

Маркерные интерфейсы как подсказка названия используются только для индикации, и они отмечают класс, реализующий этот интерфейс.

Теперь в вашем коде вы можете выполнять некоторые действия на него, как (instance instanceof Marker)

На большинстве мест Аннотации может быть использована для маркеров

Например, если @Test на классе показывает, что этот класс является тестом класса и должен выполняться. То же самое можно достичь с помощью интерфейса.

@Test //sort of marking 
class ClassToTest{ 

} 

или

class ClassToTest implements Test{ 

} 

Приведенные выше примеры являются синонимами в том, что они пытаются достичь.

Для проверки присутствия в первом случае вы попытаетесь проверить наличие аннотации @Test, а во втором случае вы сделаете отметку instanceof.

С маркерных интерфейсов вы также получаете преимущество, что если вы храните все экземпляры теста, то вы можете иметь безопасный сбор типа List<Test> или если вы хотите, чтобы сделать безопасный метод типа, который будет принимать только экземпляры Test

void method(Test testInstance){ 

} 
Смежные вопросы