Мне нужно сравнить десятки полей в двух объектах (экземпляры одного и того же класса), а также сделать некоторые записи и обновления в случае различий. Мета-код может выглядеть примерно так:
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. Сделайте, чтобы содержащий класс (объект) сделал сравнение, обновил измененные поля и возвратил сообщение журнала
Сущность не должна принимать участие в бизнес-логике
Все поля имеют строковый тип, и я могу изменить код класса, которому принадлежат поля, если требуется.
РЕДАКТИРОВАТЬ: В классе есть несколько полей, которые нельзя сравнивать.