Интерфейсы маркеров изначально использовались для придания особого значения классу до того, как Java представила аннотации (в JDK 5).Например, интерфейс Serializable
был создан в JDK 1.1.С введением аннотаций лучшим подходом - если класс должен быть помечен и не требуются дополнительные методы - является использование аннотаций.
Например, вместо того, чтобы класс реализовывал интерфейс Serializable
,в котором нет методов, лучшим подходом было бы создание аннотации @Serializable
и применение этой аннотации к классу (обратите внимание, что @Serializable
это , а не реальная аннотация, включенная в JDK).
@Serializable
public class Foo {}
Для получения дополнительной информации о том, как создавать и обрабатывать аннотации, см. Создание аннотаций в Java (простите, что я создал эту статью; она включает в себя информацию, которую вам нужно знать о аннотацииобработка, не загромождая этот ответ, копируя его прямо здесь).
Другой подход заключается в изменении мыслительного процесса за интерфейсом маркера и вместо обработки классов и выполнения действий на основе их маркеров, выдвигая логикук самому классу.Например, вместо того, чтобы искать классы с Serializable
и затем выполнять логику, логику можно было бы перенести непосредственно в интерфейс Serializable
, что позволяет клиентам вызывать логику сериализации непосредственно на объекте.Например:
public interface Serializable {
public default void writeObject(ObjectOutputStream out) throws IOException {
// ... default logic ...
}
public default void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// ... default logic ...
}
public default void readObjectNoData() throws ObjectStreamException {
// ... default logic ...
}
}
Затем сериализуемый объект может быть сериализован напрямую:
public class Foo implements Serializable {}
ObjectOutputStream os = // ... some output stream
Foo foo = new Foo();
foo.writeObject(os);