Инициализация двойной скобки Java - PullRequest
3 голосов
/ 19 февраля 2012

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

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

Into:

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 19 февраля 2012

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

2 голосов
/ 19 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...