列挙型とは
Protocol Buffers の 列挙型 は、取り得る値が、あらかじめ定義された定数の中からのみ選択可能であることを示す型で、.proto
ファイルの中で enum
キーワードを使って定義します。
列挙型は、ひとことで言うと、複数の定数をグルーピングする機能です。
下記の例では、Corpus
という列挙型を定義し、SearchRequest
メッセージ型のフィールドとして使用しています。
enum Corpus {
CORPUS_UNSPECIFIED = 0;
CORPUS_UNIVERSAL = 1;
CORPUS_WEB = 2;
CORPUS_IMAGES = 3;
CORPUS_LOCAL = 4;
CORPUS_NEWS = 5;
CORPUS_PRODUCTS = 6;
CORPUS_VIDEO = 7;
}
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 result_per_page = 3;
Corpus corpus = 4;
}
.proto のコーディングスタイル では、すべての列挙値の名前には、型名に相当するプレフィックス を付けるべしとされています(上記の CORPUS_
の部分)。
型名が 3 語以上で構成されていたりして長い場合は、略称のプレフィックスが使われることもあるようです。
0 という値にマップされるものには、サフィックスとして _UNSPECIFIED
を付けるよう推奨されています(上記の CORPUS_UNSPECIFIED
)。
これは、コーディングスタイルという観点だけではなく、proto2
との互換性確保の理由もあります。
列挙型の定数値には、32 ビット整数の範囲内で値を割り当てあることができますが、負の値は非効率 なので使うべきではないとされています。
エイリアス値の定義 (allow_alias)
列挙値はデフォルトでは同じ値を持つことはできませんが、次のように allow_alias
オプションを true
に設定することでエイリアス(別名)を定義できるようになります。
enum EnumAllowingAlias {
option allow_alias = true;
EAA_UNSPECIFIED = 0;
EAA_STARTED = 1;
EAA_RUNNING = 1;
EAA_FINISHED = 2;
}
上記の EAA_RUNNING
は、EAA_STARTED
のエイリアスとして使用することができます。