web-dev-qa-db-ja.com

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のレベルを扱っています。)

もっと良い方法はありますか?

24
fadedbee

別のオプションは(私は思う;それは久しぶりです):

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

これはこれ以上効率的ではないことに注意してください。まだfoo、bar、baz、quuxのコピーを作成しています。

30
Kenton Varda