Как без лапша-кода сравнить 2 объекта?
Например такой класс
public class MyObject{
String name;
String surname;
int age;
boolean isAlive;
}
и чтобы не писать что-то типа
boolean isEquals(Myobject o1, Myobject o2) {
if (!o1.name.equals(o2.name)) {
return false;
}
if (!o1.surname.equals(o2.surname)) {
return false;
}
if (o1.age != (o2.age)) {
return false;
}
return o1.isAlive == o2.isAlive;
}
Вам нужно переопределить метод Object::equals()
.
Вы можете автоматически сделать это через IntelliJ IDEA:
Code -> Generate -> equals and hashcode
.
У вас должно получиться что-то похожее на это:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObject myObject = (MyObject) o;
return Objects.equals(name, myObject.name) &&
Objects.equals(surname, myObject.surname) &&
age == myObject.age
isAlive == myObject.isAlive;
}
Можно будет сравнивать так:
myObject1.equals(myObject2);
Comparator<MyObject> comparator = Comparator.comparing(MyObject::getName)
.thenComparing(MyObject::getSurname)
.thenComparing(MyObject::isAlive)
.thenComparingInt(MyObject::getAge);
Comparator<MyObject> nullSafe = Comparator.nullsFirst(comparator);
return nullSafe.compare(o1, o2) == 0;
Если хочется универсальный метод, то можно как-то так, рефлекшеном, но Вы наверняка сами знаете, что это медленно и все такое:
private static boolean eq(Object o1, Object o2) {
try {
if (o1 == null && o2 == null) return true;
if (o1 == null || o2 == null) return false;
if (!o1.getClass().equals(o2.getClass())) return false;
for (Field field : o1.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object v1 = field.get(o1);
Object v2 = field.get(o2);
if (v1 == null && v2 == null) continue;
if (v1 == null || v2 == null) return false;
if (!v1.equals(v2)) return false;
}
} catch (IllegalAccessException e) {
return false;
}
return true;
}
PS: В целом не рекомендую использовать такой подход, уж лучше сгенерировать метод через ide
Если вам нужно сравнивать объекты, в них нужно переопределять метод equals()
.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyObject)) return false;
MyObject that = (MyObject) o;
return isAlive == that.isAlive &&
age == that.age &&
name.equals(that.name) &&
surname.equals(that.surname);
}
С помощью библиотеки Apache Commons Lang и рефлексии можно даже в одну строчку
return new EqualsBuilder().reflectionEquals(o1, o2);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Есть блокcontainer в который динамически с помощью jquery добавляются div блоки нумерованные от 0 до 9