Мне нужно сравнить десятки полей в двух объектах (экземпляры одного и того же класса) и сделать некоторые записи и обновления в случае наличия различий. Мета-код может выглядеть примерно так:
if (a.getfield1 != b.getfield1)
log(a.getfield1 is different than b.getfield1)
b.field1 = a.field1
if (a.getfield2!= b.getfield2)
log(a.getfield2 is different than b.getfield2)
b.field2 = a.field2
...
if (a.getfieldn!= b.getfieldn)
log(a.getfieldn is different than b.getfieldn)
b.fieldn = a.fieldn
Код со всеми сравнениями очень краток, и я хотел бы как-то сделать его более компактным. Было бы неплохо, если бы у меня был метод, который бы принимал в качестве метода параметров вызовы setter и getter и вызывал это для всех полей, но, к сожалению, это невозможно с java.
Я придумал три варианта, каждый из которых имеет свои недостатки.
1. Используйте API отражения, чтобы узнать, как получить геттеры и сеттеры.
Ужасно и может вызвать ошибки времени выполнения в именах полей полей
2. Измените поля на публичные и манипулируйте ими напрямую, не используя геттеры и сеттеры.
Уродливые, а также продемонстрировали бы реализацию класса во внешнем мире
3. Содержит содержащий класс (сущность) сравнение, обновить измененные поля и вернуть сообщение журнала
Сущность не должна участвовать в бизнес-логике
Все поля являются строковыми типами, и я могу изменить код класса, владеющего полями, если это необходимо.
EDIT: В классе есть несколько полей, которые нельзя сравнивать.