Могут ли поля, установленные Hibernate, быть окончательными? - PullRequest
3 голосов
/ 03 декабря 2010

My Eclipse автоматически выполняет ряд действий по очистке кода, когда я сохраняю файл Java, среди которых добавление полей final к private, где это возможно.

Будет ли это конфликтовать со способностью Hibernate вставлять сущностисвойства в частные поля?

@Id
private final Long id = null;   // Eclipse made this "final"
                                // but Hibernate needs to set the id

Стоит ли отключить это действие сохранения?

Обновление: Я протестировал приложение и также посмотрел его с помощью отладчика, и Hibernate действительно сбрасывает«последнее» поле, так что все продолжает работать хорошо.Но гарантированно ли это работает?Например, нет ли оптимизаций VM или компилятора, которые полагаются на то, что поле действительно является финальным.Те, вероятно, сломаются.С другой стороны, возможность устанавливать private поля с помощью отражения кажется поддерживаемым сценарием, поэтому такое же мышление, вероятно, применимо и к final?

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Даже если это работает, не делайте этого.

Последнее поле может быть записано ровно один раз, и части модели памяти Java основаны на этом факте.

Я нашел этоблог http://www.polygenelubricants.com/2010/03/modifying-static-final-fields-through.html, который показал, что можно установить финал с помощью реального хака.(Но, пожалуйста, не делайте этого ни в одном реальном приложении.)

И этот ответ на связанный вопрос: Есть ли способ объявить конечные поля для объектов, управляемых Hibernate?

В вашем случае простейшей мыслью было бы: сделать поле изменчивым и получить только геттер, но не сеттер.

0 голосов
/ 03 декабря 2010

хм интересный вопрос.Я думаю, что для постоянных объектов вы, вероятно, не хотите автоматически устанавливать финал по той причине, о которой вы упомянули.

Это определенно будет проблемой, если у вашего класса есть какая-то функциональность, когда вы делаете что-то вроде

setProperty(int prop) {
    this.prop = prop;
    fireChanged(); // updates other fields that depend on this one
}

, что я видел в профессиональном контексте.Хотя, возможно, здесь плагин достаточно умен, чтобы не сделать его окончательным.

Если вы хотите сделать ваши объекты неизменяемыми, вы можете сделать так, чтобы ваш постоянный класс возвращал свой неизменный подкласс, где поля являются частными ....

Таким образом, у этого плагина есть свои преимущества и недостатки.Я думаю, что вы можете сделать это в любом случае, если у вас есть тесты для проверки автоматически сгенерированных финалов не мешают.Лично я бы не использовал этот плагин - я бы посмотрел предупреждение IDE и выбрал мои финалы ...

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