Согласен, я пропустил двойную скобку, когда читаю код.

я есть вопрос, потому что я немного запутался (или, может быть, я не замечаю чего-то очевидного). Допустим, у меня есть некоторый исходный код, который содержит много классов, которые содержат большое количество статических полей, определенных как это:

public final class ConverterTYPE  {
    private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>() {
        {
            put("A", new Byte((byte)12));
            put("B", new Byte((byte)13));
        }
    };

}

Как мы все знаем, статические поля не будут сериализованы.

Однако Java (и Eclipse) жалуется, что «Сериализуемый класс не объявляет статическое окончательное поле serialVersionUID типа long». Почему они не могут заметить, что static не будет сериализован?

И следующий вопрос: будет ли правильным решением этого вопроса использовать@SuppressWarnings("serial") избавиться от всех таких предупреждений?

РЕДАКТИРОВАТЬ:

Ни один из моих классов не реализует интерфейс Serializable (или ни один из их суперклассов). И Затмение указывает наHashMap<String, Byte> с его предупреждениями. Почему он не обнаруживает, что это статическое поле?

 Numeron18 нояб. 2015 г., 02:50
Просто чтобы вы знали - HashMap реализует интерфейс Serializable. Поскольку вы расширяете HashMap в анонимный класс, ваш анонимный класс также реализует Serializable.
 Miha_x6428 окт. 2016 г., 18:46
Не по теме:blog.jooq.org/2014/12/08/...

Ответы на вопрос(2)

что «Сериализуемый класс не объявляет статическое окончательное поле serialVersionUID типа long». Почему они не могут заметить, что static не будет сериализован?

Сообщение об ошибке и тот факт, что в вашем классе есть последняя статическая переменная-член (по крайней мере, именно так я интерпретирую ваше описание), не имеют ничего общего друг с другом.

Ваш класс реализует интерфейсSerializableили один из суперклассов вашего класса делает это. Таким образом, компилятор замечает, что ваш класс сериализуем. Сериализуемые классы должны иметь статическое конечное поле с именемserialVersionUID который используется для управления версиями при сериализации экземпляров вашего класса.

Использование аннотации@SuppressWarnings("serial") заставляет компилятор замолчать по поводу пропавшего без вестиserialVersionUID, Так что да, вы можете использовать это, чтобы избавиться от предупреждающего сообщения, но лучшим решением будет заставить ваш класс не реализовыватьSerializable (прямо или косвенно), если он не предназначен для сериализации.

 Jesper20 янв. 2011 г., 17:00
Ой, подождите, похоже, вы используете двойную инициализацию (ужасный трюк, ИМХО). Обратите внимание, чтоHashMap инвентарьSerializableи ваш анонимный подклассHashMap не имеетserialVersionUID, Житель показывает в своем ответе, как добавитьserialVersionUID на ваш анонимный подкласс.
 Jesper20 янв. 2011 г., 16:55
@ Лукас, ты уверен? Как выглядит ваша иерархия классов?
 Lukasz20 янв. 2011 г., 16:54
Ни один из моих классов не реализует интерфейс Serializable (или ни один из их суперклассов).
 cheekoo20 янв. 2011 г., 17:03
Согласен, я пропустил двойную скобку, когда читаю код.
 Lukasz20 янв. 2011 г., 16:59
Eclipse указывает на: HashMap <String, Byte>
Решение Вопроса

что это поле не может быть сериализовано, не означает, что то, на что оно ссылается, само по себе никогда не будет сериализовано! Кто-то / что-то еще может получить ссылку на эту карту и попытаться сериализовать ее напрямую, или использовать ее как член экземпляра в сериализуемом классе и т. Д. Я вижу, что это закрытый файл, но убедившись, что он никогда не будет доступен вне текущего класса или задание члена-экземпляра выходит за рамки возможностей компилятора (и в любом случае невозможно с отражением вокруг).

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

private final static HashMap<String, Byte> STRING_MAP = new HashMap<String, Byte>();

static {  
  STRING_MAP.put("A", new Byte((byte)12));
  STRING_MAP.put("B", new Byte((byte)13));
}

Результат в большинстве случаев близок к идентичному, и ваш код не заполнен анонимными классами.

 Joe Lee-Moyet01 июл. 2014 г., 11:25
Я бы добавил, что девять из десяти статически инициализированных коллекций, подобных этой, должны быть неизменными. В этом случае библиотека Google Collections имеет хороший класс ImmutableMap, который вы можете использовать:ImmutableMap.of("A", (byte) 12, "B", (byte) 13);, Там также естьImmutableMap.<K,V>builder(), необходимо для> 5 элементов.

Ваш ответ на вопрос