Перспектива 1
Вы пишете файл .proto и отдаете его протоколу, который генерирует код Builder. Они предлагают не добавлять какие-либо методы в сгенерированный код. Если вы вообще хотите, чтобы к сгенерированному коду добавлялось какое-то пользовательское поведение, ЗАПИШИТЕ СВОЙ КЛАСС, ОБРАТИТЕ сгенерированный код.
Например, скажем, сгенерированный класс protoc - это MyMessageBuilder. И вы хотели добавить метод, который может принимать входные данные XML и выдавать сообщение, специфичное для протобуфа. Вы бы написали XmlToMyMessageBuilder, как показано ниже. Здесь XmlToMyMessageBuilder, ваш класс оборачивает сгенерированный код и добавляет пользовательское поведение fromXml ().
public class XmlToMyMessageBuilder
{
private final MyMessageBuilder protoBuilder;
public MyMessage fromXml(byte[] input()
{
protoBuilder.setXXX();
}
}
Это общий хороший принцип программирования.
Перспектива 2
Предоставляя посредника, вы также можете ОТКЛЮЧИТЬ свой код от базового механизма сериализации. Это позволяет переключать реализации сериализатора (скажем, вы хотите сериализовать полезную нагрузку, где все данные представлены в строковом формате ... где сериализация JSON со сжатием является лучшей альтернативой) с низким уровнем воздействия. Вы могли бы сделать что-то вроде этого
public interface MySerializer
{
boolean serialize(MyDomainObject input);
}
public PBBasedSerializer implements MySerializer
{
private final MyMessageBuilder protoBuilder;
...
}
public JsonBasedSerializer implements MySerializer
{
private final JSONSerializer jsonSerializer;
...
}