在 Grpc 生成的 java 代码中设置嵌套属性值的更简单方法
An easier way of setting nested properties values in Grpc generated java code
我们将 Grpc 与我们的 java 应用程序一起使用,并且我们在 protobuff 中定义了一个嵌套的 object。
原型示例:
message Person {
string name = 1;
Child child = 2;
}
message Child {
string name = 1;
Hobby hobbies = 2;
}
message Hobby {
string name = 1;
string reason = 2;
}
当我想更新 child 爱好的原因时,我必须做如下事情:
person.toBuilder()
.setChild(
person.getChild.toBuilder()
.setHobby(
person.getChild().getHobby().toBuilder()
.setReason("new reason")
.build()
)
.build()
)
.build()
上面的代码不是最好的,我的问题是是否有更好的方法来完成同样的事情?
TL;DR
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;
如果你不喜欢你的代码有多层嵌套,这会更好。
不幸的是,我认为我没有帮助到你,我很想知道 you/others 对此有何看法。
我阅读了更多这方面的内容,官方文档确实提出了一个更好的方法:
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();
我们将 Grpc 与我们的 java 应用程序一起使用,并且我们在 protobuff 中定义了一个嵌套的 object。
原型示例:
message Person {
string name = 1;
Child child = 2;
}
message Child {
string name = 1;
Hobby hobbies = 2;
}
message Hobby {
string name = 1;
string reason = 2;
}
当我想更新 child 爱好的原因时,我必须做如下事情:
person.toBuilder()
.setChild(
person.getChild.toBuilder()
.setHobby(
person.getChild().getHobby().toBuilder()
.setReason("new reason")
.build()
)
.build()
)
.build()
上面的代码不是最好的,我的问题是是否有更好的方法来完成同样的事情?
TL;DR
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;
如果你不喜欢你的代码有多层嵌套,这会更好。
不幸的是,我认为我没有帮助到你,我很想知道 you/others 对此有何看法。
我阅读了更多这方面的内容,官方文档确实提出了一个更好的方法: 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();