Ява сравнить объекты: используя отражение? - PullRequest
2 голосов
/ 05 октября 2009

У меня есть объект, который сам имеет несколько объектов в виде полей. У меня есть вопрос, у меня есть два таких объекта, и я хочу сравнить эти два. Я знаю, что могу делать равенства, сравнения и т. Д., Но есть ли способ использовать отражение, чтобы получить свойства объекта и сделать сравнение.

например, если у меня есть объект Car, который в качестве объекта колеса, который имеет объект шины, который имеет объект болтов. Пожалуйста, помните, что все вышеперечисленные объекты являются индивидуальными, а не вложенными классами. Как сравнить 2 автомобильных объекта?

Любая помощь приветствуется?

Спасибо

Ответы [ 4 ]

17 голосов
/ 05 октября 2009

Apache Commons Lang имеет класс EqualsBuilder , который делает именно это (см. Методы reflectionEquals())

 public boolean equals(Object obj) {
   return EqualsBuilder.reflectionEquals(this, obj);
 }

EqualsBuilder также предоставляет более явные методы для нулевого безопасного сравнения определенных полей, что делает запись "правильной" (то есть неотражающей) равной методам немного менее обременительным.

8 голосов
/ 05 октября 2009
public class Car {
  private Wheels wheels;
  // other properties

  public boolean equals(Object ob) {
    if (!(ob instanceof Car)) return false;
    Car other = (Car)ob;
    // compare properties
    if (!wheels.equals(other.wheels)) return false;
    return true;
  }
}

- правильный подход. Автоматическое сравнение с помощью отражения не рекомендуется. С одной стороны, «состояние» является более общей концепцией, чем сравнение отраженных свойств.

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

2 голосов
/ 05 октября 2009

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

0 голосов
/ 06 октября 2009

Идея интересная, но учтите, что размышление может быть медленным. Если вам нужно много сравнений или вы помещаете свои объекты в классы коллекций, которые выполняют сравнения (например, HashMap, HashSet и т. Д.), То сравнение объектов с помощью отражения может стать узким местом производительности.

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