Здравствуйте, Sinclair, Вы писали:
S>А что там внутри этих updateBBB()?
Там ещё могут быть простыни кода, ведь у нас 40 полей которые надо по всякому вычислять и проставлять. Если модификация p происходит очень сложно, то хочется это всё разрезать на мелкие кусочки по разным методам или даже классам, иногда даже реюзабельным из разных мест.
S>Почему нельзя просто сделать тот же With? Ведь при присванивании "в себя же" ескейп-анализ уберёт всю лишнюю нагрузку на GC, в итоге имеем тот же перформанс, лаконичный синтаксис, и отсутствие необходимости для каждого DTO еще и цельный билдер расписывать.
Как я понял, ты предлагаешь что-то вроде
public Person modify(Person p) {
p = updateAAA(p);
...
if(...) p = updateBBB(p);
else p = updateCCC(p);
...
p = updateDDD(p);
return p;
}
но это тоже частный случай, да и выглядит коряво, имхо. Захочется манипулировать одновременно двумя билдерами, то опять что-то новое придумывать:
public Result enrich(Person p, Order o) {
var iBuilder = Info.newBuilder();
var pBuilder = p.builder();
var oBuilder = o.builder();
updateAAA(pBuilder, iBuilder);
updateBBB(oBuilder, iBuilder);
updateCCC(oBuilder, pBuilder);
return new Result(pBuilder.build(), pBuilder.build(), iBuilder.build());
}
как тут можнро сделать красивее?
Лично мне пока самым удобным показалось то, что генерирует Avro,
как тут. (генерацию setters для самих dto можно запретить, оставить только у билдеров).
S>·>Ты прав. Можно только новый тип создавать оказывается.
S>Переходите на сторону CLR. У нас всё это есть Включая "annotation processors"
Нее... мы мееедленно спускаемся.