2015-10-15 5 views
1

У меня есть класс с переменными для старых данных и новых данных.Каков наилучший способ сравнения переменных одного класса?

Пример:

class Person{ 

    String newAddress; 
    int newMobileNumber; 
    String newOfficeId; 
    // many fields like this (atleast 15 fields) 

    String oldAddress; 
    int oldMobileNumber; 
    String oldOfficeId; 
    // many fields like this (atleast 15 fields) 

    //getters and setters of all the fields. 
} 

Что я делаю на щелчок кнопки сохранения старых данных и новых данных в таблицу, состоящую столбец с тем же именем, что и полей (для отслеживания старых данных)

Но если все старыеFields равны newFields, я хочу избежать, чтобы избежать операции с базой данных.

один способ это использование используется много если условия. как это,

if(oldAddress.equals(newAddress)){ 
    flag = true; 
} 
if(oldMobileNumber.equals(newMobileNumber)){ 
    flag = true; 
} 

Так что нужно много таких if(), я не считаю это решение, что хорошо. Как я могу сделать это лучше?

+1

Я создаю переменную 'Person oldPerson' в вашем классе Person. Затем я бы переопределил 'equals' и проверил, если' oldPerson.equals (newPerson) ' – SomeJavaGuy

+1

Для адреса вы можете использовать [equalsIgnoreCase] ​​(http://www.tutorialspoint.com/java/java_string_equalsignorecase.htm) – sam

+0

@ sam2090 с которыми я бы справился. это всего лишь грубый сценарий, который я дал. – piechuckerr

ответ

3

Вы также можете выбросить все эти двойные значения в свой класс Person и просто создать переменную Person, которая используется только для хранения старых значений. Вы можете просто обновить старые значения внутри методов setter. Чтобы проверить, изменилось ли какое-либо значение, вы можете переопределить метод equals и сравнить текущий объект с переменной olvValues в вашем классе Person.

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

Это может выглядеть примерно так.

public class Person{ 

    String address; 
    int mobileNumber; 
    String officeId; 
    // many fields like this (atleast 15 fields) 

    private Person oldValues; 

    public Person(String address, int mobileNumber, String officeId) { 
     this.address = address; 
     this.mobileNumber = mobileNumber; 
     this.officeId = officeId; 
     oldValues = new Person(this); 
    } 

    public Person(Person p) { 
     this.address = p.address; 
     this.mobileNumber = p.mobileNumber; 
     this.officeId = p.officeId; 
    } 

    // Your method that checks if any value did change. 
    public void checkIfValuesChanged() { 
     if(this.equals(oldValues)) { 
      // Nothing changed 
     } 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((address == null) ? 0 : address.hashCode()); 
     result = prime * result + mobileNumber; 
     result = prime * result + ((officeId == null) ? 0 : officeId.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if(!(obj instanceof Person)) return false; 
     Person other = (Person) obj; 
     if (address == null) { 
      if (other.address != null) 
       return false; 
     } else if (!address.equals(other.address)) 
      return false; 
     if (mobileNumber != other.mobileNumber) 
      return false; 
     if (officeId == null) { 
      if (other.officeId != null) 
       return false; 
     } else if (!officeId.equals(other.officeId)) 
      return false; 
     return true; 
    } 

    // Your setter methods do save the old values in the oldValues Person object 
    public void setAddress(String address) { 
     oldValues.address = this.address; 
     this.address = address; 
    } 

} 
1

Вам нужно всего лишь добавить все эти if заявления один раз, в переопределенном методе Object#equals для вашего класса.

Вы можете создать его автоматически для вас в большинстве IDE.

Возможно, вы также захотите переопределить Object#hashCode по пути.

В Ecplise

  • правой кнопкой мыши ваш класс
  • Нажмите Source ->Generate hashCode() and equals()

Затем сравнить два Person экземпляры, просто вызывая equals.

+0

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

+0

@piechuckerr это самый элегантный способ. Также обратите внимание, что 'equals' может быть вызвано неявно в коллекциях, что также может помочь вам. Я также предлагаю правильно документировать ваши критерии равенства, которые помогут вам в долгий путь при настройке проблем с кодом. – Mena

+0

Я буду вносить изменения в equals(), но мне нужно внести какие-либо изменения в созданный метод hashcode()? – piechuckerr

-1

Я предлагаю определить класс контакт и сравнить старый контакт с новым контактом с использованием стандарта равен методой

import org.junit.Test; 

public class MyTest { 

@Test 
public void myTest() { 
    Contact oldContact= new Contact("A",1,"A"); 
    Contact newContact= new Contact("A",1,"A"); 
    System.out.println(oldContact.equals(newContact)); 
} 

} 


class Contact{ 
String newAddress; 
int newMobileNumber; 
String newOfficeId; 


public Contact(String newAddress, int newMobileNumber, String newOfficeId) { 
    super(); 
    this.newAddress = newAddress; 
    this.newMobileNumber = newMobileNumber; 
    this.newOfficeId = newOfficeId; 
} 


@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Contact other = (Contact) obj; 
    if (newAddress == null) { 
     if (other.newAddress != null) 
      return false; 
    } else if (!newAddress.equals(other.newAddress)) 
     return false; 
    if (newMobileNumber != other.newMobileNumber) 
     return false; 
    if (newOfficeId == null) { 
     if (other.newOfficeId != null) 
      return false; 
    } else if (!newOfficeId.equals(other.newOfficeId)) 
     return false; 
    return true; 
} 


} 
class Person{ 

Contact newContact; 
Contact oldContact; 
public Person(Contact newContact, Contact oldContact) { 
    super(); 
    this.newContact = newContact; 
    this.oldContact = oldContact; 
} 

} 
+0

Вы неправильно поняли мой вопрос. У меня нет двух объектов. это только один объект с новыми и старыми полями. – piechuckerr

+0

Хорошо извините за непонимание –

2

Вы можете использовать ComparisonChain class from Guava для упрощения шаблонного кода. В вашем случае, будет что-то вроде этого:

return ComparisonChain.start() 
    .compare(newAddress, oldAddress) 
    .compare(newMobileNumber, oldMobileNumber) 
    ... 
    .result() == 0; 

Хотя я определенно рекомендовал бы вам избавиться от копирования и вставки, как предложил Кевин Esche. В этом случае также будет удобна цепочка сравнения.

UPD Обратите внимание, что если члены вашего класса могут быть null, чем просто oldAddress.equals(newAddress) не хватает из-за NullPointerException. И если вы не хотите зависеть от Guava, вы можете использовать Objects#equals method, чтобы упростить громоздкую нуль-проверку.

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