Метод isCellEditable и @SuppressWarnings("серийный")

Почему, если я использую этот код внутри метода:

DefaultTableModel model = new DefaultTableModel(null, vett){
    public boolean isCellEditable(int row, int col) {
        return false;
    }
};

Я получаю предупреждение, и я должен использовать "@SuppressWarnings("serial")"перед началом метода?

3 ответа

Это Eclipse(?) Предупреждает вас, что вы не предоставляете SerialVersionUID к классу, который вы создаете, который реализует Serializable (ваш внутренний класс расширяет DefaultTableModel, который является сериализуемым).

Добавление этого разрешит предупреждение:

private static final long serialVersionUID = 1L;

Лично мне не нравится это предупреждение, поскольку, как разработчики, мы в лучшем положении, чтобы знать, нужен ли идентификатор версии (вероятно, не в этом случае).

Это потому, что DefaultTableModel является сериализуемым, и он действительно хочет, чтобы вы добавили serialVersionUID к этому классу реализации, чтобы предотвратить InvalidClassException на принимающей стороне.

От Сериализуемого Javadoc:

Среда выполнения сериализации связывает с каждым сериализуемым классом номер версии, называемый serialVersionUID, который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы в отношении сериализации. Если получатель загрузил класс для объекта, который имеет serialVersionUID, отличный от класса соответствующего отправителя, то десериализация приведет к исключению InvalidClassException. Сериализуемый класс может объявить свой собственный serialVersionUID в явном виде, объявив поле с именем "serialVersionUID", которое должно быть статическим, конечным и типа long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

Как вы можете видеть ( http://docs.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html) DefaultTableModel реализует интерфейс Serializable ( http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html).

Это означает, что анонимный подкласс DefaultTableModel, который вы создаете, нуждается в закрытом статическом финальном long serialVersionUID.

Таким образом, вы должны объявить (и установить) эту переменную, например:

private static final long serialVersionUID = 1L;

Кстати, 1L не является предпочтительным значением для использования; Лучшая идея - использовать случайное значение (если вы используете Eclipse, используйте встроенную функцию для автоматической генерации значения).

Но, на мой взгляд, не стоит подавлять предупреждение.

ОБНОВЛЕНИЕ: Прочтите эту полезную информацию: Почему для сериализации требуется UID серийной версии в реализованном классе?

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