Более простой способ установки значений вложенных свойств в сгенерированном Grpc коде Java.
Мы используем 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()
Приведенный выше код не самый красивый, и мой вопрос в том, есть ли лучший способ сделать то же самое?
1 ответ
TL;DR
Детали: Лучший способ субъективен, каковы ваши ожидания? Я полагаю, что-то вроде строк:
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();