Анонимная инициализация - странное предупреждение сериализации - PullRequest
5 голосов
/ 25 октября 2011

Мне было интересно, почему, когда я использую анонимный экземпляр вместе с блоком инициализатора экземпляра, я получаю «сериализуемый класс не объявляет статическое окончательное поле serialVersionUID типа long» предупреждение во время компиляции.

Вотчто я имею в виду.Допустим, я хочу создать экземпляр ArrayList и одновременно добавить к нему что-то вроде этого:

ArrayList<Object> arrayList = new ArrayList<Object>(){{add(new Object());}}; 

Если я скомпилирую все, все в порядке, но я получаю предупреждение о пропущенном поле serialVersionUID.Теперь ArrayList уже реализует сериализуемый и имеет private static final long serialVersionUID, так почему, когда я так его использую, кажется, что это поле «исчезает», и я получаю предупреждение, что оно не объявлено?

Ответы [ 3 ]

8 голосов
/ 25 октября 2011

Когда вы создаете свой анонимный класс, вы фактически расширяете ArrayList и, следовательно, наследуете интерфейс Serializable.

Все классы Serializable должны иметь serialVersionUID, чтобы вы могли различать разные сериализованные версии классов. Поскольку анонимный тип - это новый класс, было бы неплохо дать ему идентификатор, чтобы вы могли различать разные его версии.

2 голосов
/ 25 октября 2011

Потому что вы создаете то, что по сути является подклассом. Такой подкласс нуждается в своем собственном серийном UID версии. То же самое происходит, когда вы создаете подклассы, такие как JPanel. Это не страшная проблема, если вам не требуется (де) сериализация.

1 голос
/ 25 октября 2011
new ArrayList<Object>() {

    {
        add(new Object());
    }

};

Вы не просто создаете экземпляр, но сначала определяете подкласс (анонимный) ArrayList, а затем создаете экземпляр подкласса.

Даже если в ArrayList есть private static final long serialVersionUID, так как это static , не наследуется вашим анонимным подклассом.Так что это поле отсутствует.

...