Я хочу сделать небольшое изменение в глубине дерева объектов буфера протокола 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 уровней)
Есть лучший способ?
Спасибо, я был очень удивлен, что это сработало. Я не понимал, что 'fooBuilder.getBarBuilder()' возвращает Bar.Builder * в контексте fooBuilder *. В тестовом наборе нет ошибок, поэтому он работает. Объем кода по-прежнему растет линейно с глубиной, но по крайней мере он в три раза меньше. – fadedbee
Если вы предпочитаете, вы всегда можете хранить свои объекты в форме «Builder» долговременной, а не неизменной форме сообщения, а затем вы можете сохранить указатель на конкретный подзатворщик, который вы хотите изменить и изменить повторно. Но следите за обычными проблемами дизайна с изменяемыми объектами. –