Ваше утверждение о том, что "C ++ и Java API должны делать одно и то же", является необоснованным. Они не зарегистрированы, чтобы делать то же самое. Каждый выходной язык может создавать различные интерпретации структуры, описанной в файле .proto. Преимущество этого в том, что то, что вы получаете на каждом языке, является идиоматическим для этого языка . Это сводит к минимуму ощущение, что вы, скажем, «пишете Java на C ++». Это определенно было бы, как бы чувствовал бы , если бы для каждого класса сообщений был отдельный класс построителя.
Для целочисленного поля foo
вывод C ++ из protoc будет включать в класс метод void set_foo(int32 value)
для данного сообщения.
Вывод Java будет генерировать два класса. Один напрямую представляет сообщение, но имеет только получатели для поля. Другой класс является классом строителя и имеет только установщики для поля.
Выход Python по-прежнему отличается. Сгенерированный класс будет содержать поле, которым вы можете напрямую манипулировать. Я ожидаю, что плагины для C, Haskell и Ruby также совершенно разные. Пока они все могут представлять структуру, которая может быть преобразована в эквивалентные биты на проводе, они выполняют свою работу. Помните, что это «буферы протокола», а не «буферы API».
Исходный код подключаемого модуля C ++ предоставляется с дистрибутивом protoc . Если вы хотите изменить тип возвращаемого значения для функции set_foo
, вы можете это сделать. Обычно я избегаю ответов, которые сводятся к: «Это открытый исходный код, поэтому любой может его изменить», потому что обычно не полезно рекомендовать кому-то изучить совершенно новый проект достаточно хорошо, чтобы внести серьезные изменения просто для решения проблемы. Однако я не ожидаю, что в этом случае будет очень сложно. Самым сложным было бы найти раздел кода, который генерирует сеттеры для полей. Как только вы обнаружите это, внесение необходимых изменений, вероятно, будет простым. Измените тип возвращаемого значения и добавьте оператор return *this
в конец сгенерированного кода. После этого вы сможете писать код в стиле, указанном в ответ Хрнта .