Инициализация двойной скобки 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
,