Здравствуйте, vsb, Вы писали:
vsb>vsb>var person1 = Person with {
vsb> lastName = l;
vsb> firstName = f;
vsb> age = 18;
vsb>};
vsb>var person2 = person1 with {
vsb> age = 16;
vsb>};
vsb>
По-моему фигня какая-то, первое — просто сахарок, который IDEA уже и так подсказывает в виде parameter hints. Второе — как в scala case-class, очень неудобно, когда модификация поля порождает новый объект — жуть.
Для dto в 40 полей такое всё равно не годится. Нужен билдер, чтобы по частям можно было собирать.
Хочется такого:
public Person modify(Person p) {
var builder = p.builder();
updateAAA(builder);
...
if(...) updateBBB(builder);
else updateCCC(builder);
...
updateDDD(builder);
return builder.build();
}
vsb>В целом это сделает их юзабельными. Конечно без мутабельности будет неудобно и придётся менять фреймворки, но тут разработчики уже упёрлись рогом.
В принципе хорошо иметь иммутабельность, но это требует парный мутабельый билдер и всё становится сложно с т.з. дизайна ЯП.
vsb>·>Не скажу за весь lombok, но по-моему геттеры-сеттеры можно генерить используя вполне себе стандартный annotation processor.
vsb>Я сам не пробовал annotation processor-ы писать, поэтому могу ошибаться. Но в моём понимании annotation processor может генерировать либо полностью новый класс, который старый код видеть не будет. Либо какие-то там проверки делать и тд. То бишь максимум, который можно сделать оставаясь в рамках того, что разрешено — руками объявить interface Person { String name(); String name(String name); }, а annotation processor сгенерирует class PersonImpl implements Person { ... } и ты его экземпляр уже как-то получишь.
Ты прав. Можно только новый тип создавать оказывается.