Более простой способ установки значений вложенных свойств в сгенерированном 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();
Другие вопросы по тегам