2015-03-23 3 views
11

Я хочу сделать небольшое изменение в глубине дерева объектов буфера протокола 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 уровней)

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

ответ

10

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

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

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

+1

Спасибо, я был очень удивлен, что это сработало. Я не понимал, что 'fooBuilder.getBarBuilder()' возвращает Bar.Builder * в контексте fooBuilder *. В тестовом наборе нет ошибок, поэтому он работает. Объем кода по-прежнему растет линейно с глубиной, но по крайней мере он в три раза меньше. – fadedbee

+1

Если вы предпочитаете, вы всегда можете хранить свои объекты в форме «Builder» долговременной, а не неизменной форме сообщения, а затем вы можете сохранить указатель на конкретный подзатворщик, который вы хотите изменить и изменить повторно. Но следите за обычными проблемами дизайна с изменяемыми объектами. –

Смежные вопросы