2015-07-20 4 views
1

Я пишу pojo, где я переопределяю hashcode и equals, Но мое условие для создания равных объектов имеет условие ИЛИ. В этом случае, как писать hashcode ???Переопределение hashcode с условием ИЛИ

К примеру, у меня есть POJO, имеющий три поля, как ааа, ГЭБ, КЧК и условия лечения равно есть ааа должны быть равны и либо ГЭБ или ссс должны быть равны .Я писал в равных переопределение раздел, но что писать в hashcode в этом случае ???

public class POJO { 

private String aaa; 
private String bbb; 
private String ccc; 

///How to use or condition here ??????? 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((aaa == null) ? 0 : aaa.hashCode()); 
    result = prime * result + ((bbb == null) ? 0 : bbb.hashCode()); 
    return result; 
} 
//my condition is aaa and (bbb or ccc) should be equal 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    POJO other = (POJO) obj; 
    if (aaa == null) { 
     if (other.aaa != null) 
      return false; 
    } else if (!aaa.equals(other.aaa)) 
     return false; 
    if (bbb == null || ccc == null) { 
     if (other.bbb != null || other.ccc != null) 
      return false; 
    //This is the main condition 
    } else if (!bbb.equals(other.bbb) || !ccc.equals(other.ccc)) 
     return false; 
    return true; 
} 
public String getAaa() { 
    return aaa; 
} 
public void setAaa(String aaa) { 
    this.aaa = aaa; 
} 
public String getBbb() { 
    return bbb; 
} 
public void setBbb(String bbb) { 
    this.bbb = bbb; 
} 
public String getCcc() { 
    return ccc; 
} 
public void setCcc(String ccc) { 
    this.ccc = ccc; 
} 




} 

ответ

2

Ваша equals логика противоречива, поэтому вы не можете определить последовательную hashCode.

Предположим, у вас есть 3 объекта со следующими значениями:

aaa bbb ccc 

    "a1" "b1" "c1" 
    "a1" "b1" "c2" 
    "a1" "b2" "c2" 

Согласно вашей логике, первый объект равен второму (как ааа и ВВВ свойства равны), а второй равен к третьему (оба свойства aaa и ccc равны), но первое не равно третьему (так как оба свойства bbb и ccc не равны). equals должен быть транзитивным.

От Javadoc:

равенства метод реализует отношение эквивалентности на непустых ссылок объекта:

  • Это рефлексивный: для любого ненулевого опорного значения х, х. equals (x) должен возвращать true.
  • Это симметрично: для любой ненулевой ссылки значения x и y, x.equals (y) должны возвращать true тогда и только тогда, когда y.equals (x) возвращает true.
  • Это является переходным: для любых ненулевых значений ссылок х, у и г, если x.equals (у) возвращает истину и y.equals (г) возвращает истину, то x.equals (г) должен вернуть true.
  • Это последовательно: для любых ненулевых значений ссылок х и у, несколько призываний x.equals (у) последовательно возвращают истину или последовательно возвращения ложного, не представило никакой информации, используемую в равных сравнения на объектов изменен.
  • Для любого ненулевого опорного значения х, x.equals (NULL) должен возвращать ложь.
0

Договор функции Hashcode заключается в следующем (от Javadoc):

  • Всякий раз, когда он вызывается на одном объекте более чем один раз в течение выполнения приложения Java, то Метод hashCode должен последовательно вернуть одно и то же целое число, при условии, что информация не используется в равных . Это целое число не должно оставаться , согласующееся с одним исполнением приложения на другое выполнение того же приложения.
  • Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен производить одинаковый целочисленный результат.
  • Не требуется , что если два объекта равен по равным методам (java.lang.Object), то вызов метода HashCode на каждый из двух объектов должны производить различные результаты целочисленных. Однако программист должен знать, что при создании отличных итоговых значений для неравных объектов может улучшиться производительность хэш-таблиц .

Если ваш код удовлетворяет трем условиям, ваш код верен.

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