@SuppressWarnings ( "последовательный" )

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

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". Почему они не могут заметить, что статичность не будет сериализована?

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

EDIT:

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

Ответ 1

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

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

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));
}

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

Ответ 2

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

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

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

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