Рубрики
Без рубрики

Эффективная Java! Используйте интерфейсы маркеров для определения типов

Погружение в главу 41 Эффективной Java. Помечено как java, эффективный, аннотация, архитектура.

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

Интерфейсы маркеров , как и все интерфейсы, определяют тип. Это действительно то, откуда берется суть того, когда их следует использовать. При определении типа мы позволяем себе использовать эту возможность, чтобы помочь нам во время компиляции. Давайте рассмотрим приведенный выше пример Сериализуемый . Основной потребитель этого интерфейса, ObjectOutputStream.write , мог бы использовать эту возможность, зная, что для этого требуется объект типа Serializable , чтобы определить его метод write как принимающий Сериализуемый объект. Если бы это было сделано, мы бы знали во время компиляции (или, что более вероятно, во время кодирования из-за помощи нашей IDE), когда мы пытались передать объект, который не будет работать, этому методу. К сожалению, разработчик этого класса не воспользовался возможностью создать интерфейс таким образом, и вместо этого он использует объект но это все равно поучительно для хорошего потенциального использования интерфейса marker . В других случаях, когда мы должны использовать интерфейс маркера, мы видим, что интерфейс маркера применим только к подтипам определенного родительского интерфейса. В этом случае мы просто расширяем родительский интерфейс, и тогда мы знаем, что все классы, реализующие этот интерфейс, также имеют родительский интерфейс. Как указано выше, если определение типа имеет смысл для создаваемого вами маркера, интерфейсы маркеров – это правильный путь.

Итак, когда аннотации маркеров имеют смысл? Некоторые вещи могут привести нас к использованию одного из них вместо интерфейсов, когда мы отмечаем что-то отличное от типа. Очевидно, что это невозможно с интерфейсом, который так естественно вписывается сюда. Мы также можем повысить ценность согласованности при работе в рамках с большим количеством аннотаций, чтобы следовать норме и использовать аннотации маркеров вместо интерфейсов маркеров . Это приятно тем, что все фреймворки кажутся собранными вместе, и вы иногда не используете интерфейсы и аннотации в другое время.

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

Оригинал: “https://dev.to/kylec32/effective-java-use-marker-interfaces-to-define-types-45ob”