0

我们将 Grpc 与我们的 java 应用程序一起使用,并且我们在 protobuff 中定义了一个嵌套对象。

原型示例:

message Person {
  string name = 1;
  Child child = 2; 
}

message Child {
  string name = 1;
  Hobby hobbies = 2;
}

message Hobby {
  string name = 1;
  string reason = 2;
}

当我想更新孩子爱好的原因时,我必须执行以下操作:

person.toBuilder()
.setChild(
    person.getChild.toBuilder()
        .setHobby(
            person.getChild().getHobby().toBuilder()
                .setReason("new reason")
                .build()
        )
        .build()
)
.build()

上面的代码不是最好的,我的问题是是否有更好的方法来完成同样的事情?

4

1 回答 1

1

TL;博士

Person.Builder builder = person.toBuilder();
builder.getChildBuilder().getHobbyBuilder().setReason("new reason");
Person personWithUpdatedReason = builder.build();

细节:更好的方式是主观的,你有什么期望?我相信,大致如下:

person.getChild().getHobby().setReason("new reason");

如果是这种情况,您会希望对象是可变的,这取决于上下文,这可能不是一件好事。

另一个例子:

Hobby newHobby = person.getChild().getHobby().toBuilder().setReason("new reason").build();
Child newChild = person.getChild().toBuilder().setHobby(newHobby).toBuild();
Person newPerson = person.toBuilder().setChild(newChild).toBuild();

return newPerson;

如果您不喜欢您的代码具有多级嵌套,这会更好。

不幸的是,我认为我没有帮助您,而是很想知道您/其他人对此的看法。

我对此进行了更多阅读,官方文档确实提出了更好的方法: https ://developers.google.com/protocol-buffers/docs/reference/java-generated?csw=1#sub-builders

因此,您可以编写如下代码:

Person.Builder builder = person.toBuilder();
builder.getChildBuilder().getHobbyBuilder().setReason("new reason");
Person personWithUpdatedReason = builder.build();
于 2021-01-31T17:52:55.057 回答