Protobuf枚举类型的应用

简单的实验

proto如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

syntax = "proto3";

message SearchRequest3 {

  enum Corpus{
    UNIVERSAL = 0;
    WEB       = 1;
    IMAGES    = 2;
    LOCAL     = 3;
    NEWS      = 4;
    PRODUCTS  = 5;
    VIDEO     = 6;
  }

  string query           = 1;
  int32  page_number     = 2;
  int32  result_per_page = 3;
  Corpus corpus          = 4;
}

java代码如下:

1
2
3
4
5
6
7
8

SearchRequest3OuterClass.SearchRequest3.newBuilder()
        .setQuery("query")
        .setPageNumber(1)
        .setResultPerPage(1)
        .setCorpusValue(SearchRequest3OuterClass.SearchRequest3.Corpus.UNIVERSAL.getNumber())
        .build();

(感觉代码不是很优雅,还需要持续的学习,寻找更优雅的编码方案)

为值定义别名

可以通过为不同的枚举常量分配相同的值来定义别名,为此需要经applow_alias选项设置为true,否则协议编辑器将在找到别名时生成错误消息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

message MyMessage1 {
  enum EnumAllowingAlias {
    option allow_alias = true;
    UNKNOWN = 0;
    STARTED = 1;
    RUNNING = 1;
  }
}

我是知道java的枚举时不支持修改original的值的,我很好奇这个别名时如何实现的,发现如下源码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19

    public enum EnumAllowingAlias
        implements com.google.protobuf.ProtocolMessageEnum {
      /**
       * <code>UNKNOWN = 0;</code>
       */
      UNKNOWN(0),
      /**
       * <code>STARTED = 1;</code>
       */
      STARTED(1),
      ;

      /**
       * <code>RUNNING = 1;</code>
       */
      public static final EnumAllowingAlias RUNNING = STARTED;
}

有点意思,这是非常巧妙的一种实现方式。