Сравнение всех полей двух классов

174
13 февраля 2018, 07:36

У меня в классе куча полей и каждый раз писать такого рода проверки кажется мне не правильным, вот:

if (tmpProfileModel != null) {
                    if (tmpProfileModel.getLastName().equals(profileModel.getLastName()) &&
                            tmpProfileModel.getFirstName().equals(profileModel.getFirstName()) &&
                            tmpProfileModel.getBirthday().equals(profileModel.getBirthday()) &&
                            tmpProfileModel.getGender().equals(profileModel.getGender()) &&
                            tmpProfileModel.getFacebook().equals(profileModel.getFacebook()) &&
                            tmpProfileModel.getInstagram().equals(profileModel.getInstagram()) &&
                            tmpProfileModel.getEducation().equals(profileModel.getEducation()) &&
                            tmpProfileModel.getImage().equals(profileModel.getImage())) {
                        intent.putExtra(ProfileActivity.IS_EDITED_KEY, false);
                    } else {
                        intent.putExtra(ProfileActivity.IS_EDITED_KEY, true);
                        intent.putExtra(ProfileActivity.EDITED_OBJECT_KEY, profileModel);
                    }
                }

Еще дюжина полей, которое урезал. Теперь мне нужно проверить все эти поля на Null, будут еще много проверок и уже путаюсь.

Как вы решаете такого рода задачи?

Answer 1

Кроме выноса логики сравнения в отдельный метод (о чем написал @Serodv) можно использовать Objects.equals, который сравнивает два значения принимая во внимание null:

boolean isPartiallyEqual(Model other) {
    if(other==null) return false;
    return Objects.equals(getFirstName(), other.getFirstName()) &&
           Objects.equals(getBirthday(), other.getBirthday()) &&
           ...
}

Для большего упрощения можно подключить Apache Commons Lang и использовать EqualsBuilder.

С помощью этого класса можно проверить все поля с помощью рефлексии:

return EqualsBuilder.reflectionEquals(this, other);

либо построить свой объект сравнения с заданным списком полей:

if(other==null) return false;
return new EqualsBuilder()
             .append(getFirstName(), other.getFirstName())
             .append(getBirthday(), other.getBirthday())
             ...
             .isEquals();
Answer 2

Реализуйте в своём классе методы, обеспечивающие проверки

class SomeClass {
...
    boolean someEquals(SomeClass someObj) {
        return getFirstName().equals(someObj.getFirstName()) &&
               getBirthday().equals(someObj.getBirthday()) &&
               getGender().equals(someObj.getGender()) &&
               .....;
    }
}

ну и проверка

if (tmpProfileModel.someEquals(profileModel))
READ ALSO
Авторизация Retrofit 2

Авторизация Retrofit 2

Добрый день помогите разобраться с кодомХочу получить данные с сервера в формате JSON

257
Область определения для generic'а

Область определения для generic'а

Подскажите как можно задать область определения типа generic'a при создании объекта?То есть в угловых скобках я могу вписать на пример только...

214
BluetoothLE как создать пару с сенсором, требующим пинкод

BluetoothLE как создать пару с сенсором, требующим пинкод

После сканирования получаю соединение с найденным приборомВсе стандартно: читаются сервисы и характеристики, посылается ответ и прибор...

148
Как получить результат из JavascriptExecutor.executeScript()?

Как получить результат из JavascriptExecutor.executeScript()?

Для загрузки страницы c Selenium используется вот такой код:

162