Небольшое изменение объекта буферов протокола Java

Я хочу сделать небольшое изменение, глубоко в дереве объектов буфера Java-протокола.

Я могу использовать метод .getBuilder() для создания нового объекта, который является клоном старого с некоторыми изменениями.

Когда это делается на глубоком уровне, код становится уродливым:

Quux.Builder quuxBuilder = foo.getBar().getBaz().getQuux().toBuilder()
Baz.Builder bazBuilder = foo.getBar().getBaz().toBuilder()
Bar.Builder barBuilder = foo.getBar().toBuilder()
Foo.Builder fooBuilder = foo.toBuilder()

quuxBuilder.setNewThing(newThing);
bazBuilder.setQuux(quuxBuilder);
barBuilder.setBaz(bazBuilder);
fooBuilder.setBar(barBuilder);

Foo newFoo = fooBuilder.build();

(Это всего 4 уровня, я регулярно занимаюсь 5-8 уровнями.)

Есть ли лучший способ?

Ответ 1

Другой вариант (я думаю, это было время):

Foo.Builder fooBuilder = foo.toBuilder();
fooBuilder.getBarBuilder().getBazBuilder().getQuuxBuilder()
    .setNewThing(newThing);
newFoo = fooBuilder.build();

Обратите внимание, что это не более эффективно; вы все еще делаете копии foo, bar, baz и quux.