Инициализация двойной скобки Java

Я рефакторил следующую инициализацию объекта:

Req r = new Req();
r.set_f1("A");
r.set_f2(123);
r.set_f3(123.456);

В:

Req r = new Req() {{
    set_f1("A");
    set_f2(123);
    set_f3(123.456)
}};

Во втором примере выдается следующее предупреждение Eclipse:

Сериализуемый класс не объявляет статическое окончательное поле serialVersionUID типа long

Я думал, что эти примеры кода должны быть эквивалентны - какая разница?

2 ответа

Решение

Если базовый класс реализует java.io.Serializable тогда подклассы должны иметь serialVersionUID, Внутренние классы не должны быть сериализуемыми.

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

Второй создает анонимный подкласс и инициализирует его безымянным инициализатором. Если Req является сериализуемым, любой его подкласс, и, следовательно, должен определять serialVersionUID,

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