Одной из привлекательных особенностей буферов протокола является то, что он позволяет расширять определения сообщений без нарушения кода, использующего более раннее определение. В случае перечисления according to the documentation:Как создать для будущего дополнительного значения перечисления в буферах протокола?
поле с перечислимого типа может иметь только один из заданного набора констант как его значение (если вы пытаетесь представить другое значение, анализатор будет относиться к ней как к неизвестное поле)
поэтому, если вы расширяете перечисление и используете новое значение, тогда поле с этим типом в старом коде будет неопределенным или будет иметь значение по умолчанию, если оно есть.
Что такое хорошая стратегия для решения этой проблемы, зная, что в будущем у перечисления могут быть добавлены дополнительные значения?
Один из способов, который приходит на ум, состоит в том, чтобы определить «неопределенный» член перечисления и сделать это по умолчанию, а затем старый код будет знать, что ему было отправлено то, что он не может интерпретировать. Разве это разумно, есть ли лучшие способы справиться с этой ситуацией?
Следующее решение состоит в том, чтобы никогда не добавлять значения в существующее перечисление, а вместо этого добавлять новый. – glennr
Из кода, который я смотрел сегодня (Java), не ясно, что значение по умолчанию помогает. Поле enum уже имеет значение по умолчанию (первое значение перечисления), но это значение назначается и отменяется. Таким образом, isInitialized() терпит неудачу, потому что сканирование требуемых полей видит, что hasField boolean является ложным. Enum, required, extendable - выбрать любые два? – VoiceOfUnreason
@VoiceOfUnreason: Правильно: если вы сделаете необходимое перечисление, непредвиденные значения будут считаться несовместимыми. По умолчанию используется только если он не является обязательным. – poolie