Метод 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 на принимающей стороне.
Среда выполнения сериализации связывает с каждым сериализуемым классом номер версии, называемый 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 серийной версии в реализованном классе?