簡體   English   中英

在 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;
}

當我想更新孩子愛好的原因時,我必須執行以下操作:

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

上面的代碼不是最好的,我的問題是是否有更好的方法來完成同樣的事情?

TL;博士

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

細節:更好的方式是主觀的,你有什么期望? 我相信,大致如下:

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

如果是這種情況,您會希望 object 是可變的,這取決於上下文,可能不是一件好事。

另一個例子:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM