2025年7月14日に発表された変更点
2025年7月14日にProtocol Buffersについて発表された変更点。
FieldDescriptor Enumの非推奨化
FieldDescriptor
enumと、それに関連するoptional、required、repeatedを表す値に関する今後の変更を発表します。より正確なアクセサメソッドの使用を推奨するため、これらは非推奨になります。
背景
かつてFieldDescriptor.label
enumは目的を果たしていましたが、Protocol Buffersの進化により、フィールドのカーディナリティ(単数/繰り返し)と存在セマンティクスを決定するためのより慣用的な方法が導入されました。
- proto2では、
optional
、required
、repeated
は明示的なキーワードです。 - proto3では、
required
はサポートされなくなりました。すべてのスカラーフィールドは、設定されていない場合でもデフォルト値を持つという意味で、暗黙的に「optional
」です。optional
キーワードは後にproto3で再導入され、スカラーフィールドの存在を明示的に追跡するために使用されました(未設定のフィールドと、そのデフォルト値に設定されたフィールドを区別するため)。 - Edition 2023では、
optional
およびrequired
キーワードを削除し、それらの動作を制御するために機能を使用しています。
label
enumは、これらの異なる概念(カーディナリティ、必須性、明示的な存在追跡)を混同し、特にproto3のフィールド存在モデルにおいて、混乱を招く可能性があります。
影響と移行
FieldDescriptor.label
フィールドは最終的にAPIから削除されます。
このトピックのメソッド名は、言語によってはスペルが若干異なる場合があります。
- Protocol Buffer Editionsフィールドの場合
- Editionsの主要メソッド
hasPresence
は、単数フィールドがプレゼンスを追跡するかどうかを判断するための主要なメソッドとなり、そのフィールドのfeatures.field_presence
設定を反映します。
- 移行: カーディナリティには
isRepeated
とisRequired
を、単数フィールドの明示的な存在追跡にはhasPresence
を使用してください。
- Editionsの主要メソッド
- proto2/proto3フィールドの場合:
getLabel
は最終的に削除される予定であり、それまでの間も推奨されません。
コード内でFieldDescriptor
オブジェクトと対話するProtocol Buffersのすべてのユーザー(コード生成、リフレクション、動的メッセージ処理など)は、FieldDescriptor.label
の直接使用から移行する必要があります。
代わりに、コードを更新して以下のメソッドを使用してください。
- フィールドが繰り返されるかどうかを確認するには:
field.isRepeated
- フィールドが必須かどうかを確認するには(proto2とeditionsのみ):
field.isRequired
- 単数フィールドが明示的なプレゼンスを持つかどうかを確認するには、
hasPresence
を使用します
タイムライン
この非推奨化は即座に有効になります。getLabel
は引き続き機能しますが、将来の互換性と明確性を確保するために、積極的にコードを移行することをお勧めします。この変更により、Protocol Buffersを使用する開発者にとって、より堅牢で理解しやすい体験がもたらされます。