ProtobufのEnum定義

名前付き定数と数値を持つprotobufのenum型の定義方法。必須のゼロ値、エイリアス、予約値、ネストされたenum定義を解説します。

Enums & Oneof

詳細な説明

Protobufでの列挙型の定義

Enumは名前付き整数定数の固定セットを定義します。状態、カテゴリ、モードを型安全に表現するために不可欠です。

syntax = "proto3";

enum Priority {
  PRIORITY_UNSPECIFIED = 0;
  PRIORITY_LOW = 1;
  PRIORITY_MEDIUM = 2;
  PRIORITY_HIGH = 3;
  PRIORITY_CRITICAL = 4;
}

message Task {
  string title = 1;
  string description = 2;
  Priority priority = 3;
  Status status = 4;

  // ネストされたenum
  enum Status {
    STATUS_UNSPECIFIED = 0;
    STATUS_TODO = 1;
    STATUS_IN_PROGRESS = 2;
    STATUS_DONE = 3;
    STATUS_ARCHIVED = 4;
  }
}

ゼロ値ルール

proto3では、最初のenum値はゼロでなければならず、デフォルト値として機能します。慣例として*_UNSPECIFIEDまたは*_UNKNOWNと名付けます。これは前方互換性に重要です:不明なenum値を持つメッセージを受信した場合、数値として保存されますが、言語固有のアクセサによってゼロ値として報告される場合があります。

命名規則

Googleのスタイルガイドでは以下を推奨:

  • Enum型名:PascalCase(例:OrderStatus
  • 値名:enum型をプレフィックスとしたSCREAMING_SNAKE_CASE(例:ORDER_STATUS_PENDING
  • プレフィックスは複数のenumがスコープ内にある場合の名前衝突を防ぎます

予約された値と名前

reservedを使用して廃止されたフィールド番号や名前の再利用を防ぎます:

enum Status {
  reserved 2, 15, 9 to 11;
  reserved "OLD_STATUS", "LEGACY_STATUS";
  STATUS_UNSPECIFIED = 0;
  STATUS_ACTIVE = 1;
}

エイリアス

option allow_alias = true;を設定すると、複数の名前を同じ数値にマッピングできます。enum値のリネーム時の後方互換性に便利です。

ユースケース

有限状態機械(注文ステータス、タスク優先度)、APIエラーコード、権限レベル、機能カテゴリなど、既知の有効値セットを持つフィールドのモデリング。

試してみる — Protobuf Definition Parser

フルツールを開く