34

クラスがあるとしましょうUser

public class User {
  private Long id;
  private String name;
  private Integer age;
  private BigDecimal account;
  // other fields, getters and setters
}

equals次のようにメソッドをオーバーライドするのは適切ですか?

@Override
public boolean equals(Object ob) {
   if (ob == null) {
       return false;
   }
   if (this == ob) {
       return true;
   }
   if (ob instanceof User) {
       User other = (User) ob;
       return this.id.equals(other.getId());
   }
   return false;
}

オブジェクトの一意性は、その ID によってのみ決定されることがわかりました。しかし、私のアプリケーションでidは、常に一意です。データベースで提供されます。私のequals実装はこれを説明するのに十分な能力がありますか? それとも、これはベストプラクティスではありませんか?

もちろん、この場合、hashCode実装は次のようにする必要があることを理解しています。

@Override
public int hashCode() {
   return id.intValue();
}
4

5 に答える 5

2

equalsまだ永続化されていないエンティティを DB と比較する必要がない限り、メソッドにid を使用してもかまいません。まだ保存されていないエンティティを比較する場合は、それらの属性を比較する必要があります。

于 2013-06-09T14:42:02.157 に答える
1

大丈夫だよ。2 人の異なるユーザーが同じ ID を持つことができない限り、equals関数は十分です。1 人のユーザーが (何らかの理由で) 異なる ID で 2 回表される可能性があり、それらを等しいと見なしたい場合、問題が発生する可能性があります。

于 2013-06-08T20:20:35.587 に答える
0

私はそれがIDにあることに同意します。しかし、データベースを更新する必要があるデータを取得するときに問題が発生しました。この例では、equals が ID のみを参照する User を使用して、これを作成しました。

interface DataEquals<T extends DataEquals> {
   public boolean isDataEquals(T other)
}


User implements DataEquals<User> {
   public boolean isDataEquals(User other) {
      boolean b1 = getName().equals(other.getName());
      boolean b2 = getAge().equals(other.getAge());
      boolean b3 = getAccount().equals(other.getAccount());
      return b1 && b2 && b3;
   }
}

これでこれができます。

public class ListChanges<T extends DataEquals<T>> {

  private List<T> added = new ArrayList<T>();
  private List<T> removed = new ArrayList<T>();
  private List<T> changed = new ArrayList<T>();
  private List<T> unchanged = new ArrayList<T>();

  public ListChanges() {
    super();
  }
  public List<T> getAdded() {
    return added;
  }
  public List<T> getChanged() {
    return changed;
  }
  public List<T> getRemoved() {
    return removed;
  }
  public List<T> getUnchanged() {
    return unchanged;
  }

  public boolean hasAnyChanges() {
    return added.size()>0 || removed.size()>0 || changed.size()>0;
  }

  public void parse(List<T> oldList,List<T> newList) {
    for (T oldObj : oldList) {
        int index =newList.indexOf(oldObj);
        if (index==-1) {
            removed.add(oldObj);
        } else {
            T newObj = newList.get(index);

            if (newObj.isDataEquals(oldObj)) {
                unchanged.add(oldObj);
            } else {
                changed.add(newObj);
            }
        }
    }
    for (T newObj : newList) {
        if (oldList.indexOf(newObj)==-1) {
            added.add(newObj);
        }
    }
 }
}

次に、これを行うことができます

List<User> oldList = ....;
List<User> newList = ...;
ListChanges<User> listChanges = new ListChanges<User>();
listChanges.parseChanges(oldList,newList);

これがこれを行う方法であることに同意しますか。??????

于 2016-09-21T08:55:58.917 に答える