Рекомендовать объявление константы через интерфейс

Я некоторое время играл с сериализуемым интерфейсом для моего маленького любимого проекта, и я часто замечаю предупреждение о том, как я должен определять static final long serialVersionID,

Я искал способ заставить мои собственные интерфейсы выдавать подобное предупреждение (заставлять / рекомендовать объявление константы в любом классе, который ее реализует) и пока не нашел ничего. Seralizable Интерфейс - это просто маркерный интерфейс, так что он на самом деле ничего не содержит, и самый близкий, на который я когда-либо отвечал, отвечая на мой вопрос, - это тема на dreamincode.

Кто-нибудь может помочь, потому что это звучит как очень полезная функция?

2 ответа

Решение

serialVersionID (поле) не объявляется в качестве члена интерфейса Serializable. Имя поля - это просто соглашение, и доступ к полю осуществляется во время выполнения. Невозможно использовать интерфейсы для определения полевого контракта.

Предупреждение - это "магия компилятора", которая знает, что она должна выдавать предупреждение при обнаружении типа, реализующего Serializable, у которого нет такого поля. Это поведение предупреждения нельзя эмулировать для других полей только в коде приложения - для получения аналогичного предупреждения требуется использовать [настроенный] компилятор или средство проверки lint / code, которое понимает требуемую эвристику.

Самый простой - просто объявить значение. Что-то вроде:

private static final long serialVersionUID = 1L;

Причиной этого является управление сериализацией / десериализацией ваших объектов. Если вы сериализуете экземпляр класса, который не имеет serialVersionUIDсистема генерирует единицу из текущего определения класса. Если вы измените класс каким-либо существенным образом, сгенерированный системой идентификатор изменится. Это, в свою очередь, предотвратит десериализацию объекта, сериализованного со старым идентификатором.

Если вы сериализуете объекты, но не сохраняете их, то определение идентификатора, вероятно, не требуется (за исключением того, чтобы избавиться от предупреждения компилятора).

Смотрите эту тему для получения дополнительной информации.

Другие вопросы по тегам