2014-09-17 3 views
0

Я заметил, что при вызове списка классов домена в Grails результаты, которые я возвращаю, являются экземплярами прокси, а не фактическими экземплярами класса домена.Grails - List возвращает проксированные классы вместо классов домена

Пример:

println User.list() 

[ com.mypackage.security.User_$$_javassist_28 ] 

При сравнении экземпляра одного из этих прокси-классов против экземпляра класса соответствия домена, я получаю ложный результат равенства.

Отлич- "Отличия от Java" документации говорится:

означает == равно на всех типах. ... Таким образом, для простоты == означает Equals() в Groovy

Однако при сравнении класс домена к одному из этих классов прокси это не кажется, чтобы быть правдой.

Может ли кто-нибудь дать некоторое представление об этом?

Есть ли способ вызова списка и получения фактических экземпляров класса домена?

Я бы предпочел не предоставлять пользовательский getHashCode и равную реализацию, чтобы обойти это.

спасибо.

+0

Вы переопределили equals() и hashCode() в классе домена? – evanwong

+0

@evanwong - Нет Я не переопределяю равных или hashCode – cweston

ответ

0

Я не думаю, что вы можете заставить его возвращать другой тип, используя list(), а == return false не должен ничего делать, какой тип возвращается по списку.

В Java, для того чтобы 2 объекта одного типа были одинаковыми, вы должны реализовать equals и hashCode. Groovy делится тем же, даже вы можете использовать == для проверки равенства.

Назад к вашему вопросу.

== средства равны на всех типах. ... Таким образом, для простоты == означает Equals() в Groovy

Это не вся история.

Here - лучшее объяснение.

В ситуациях, когда два объекта могут считаться «равными» с помощью обычных механизмов «принуждения» Groovy, оператор == сообщает о них как равные; метод .equals() не сделает этого, если это нарушит нормальные правила, которые Java имеет вокруг метода equals.

Теперь, поскольку вы хотите избежать реализации, вы, вероятно, воспользуетесь преимуществами Groovy AST. Вы можете аннотировать класс с помощью @EqualsAndHashCode, чтобы он обрабатывал его для вас. Grooydoc here.

Смежные вопросы