3

私のEnumの元のJavaコードは次のとおりです。

public enum CarModel {
    NOMODEL("NOMODEL");
    X("X"),
    XS("XS"),
    XSI("XS-I"); //NOTE the special - character. Can't be declared XS-I
    XSI2("XS-I.2"); //NOTE the special . character. Can't be declared XS-I.2
    private final String carModel;
    CarModel(String carModel) { 
        this.carModel = carModel;
    }

    public String getCarModel() { return carModel; }

    public static CarModel fromString(String text) {
        if (text != null) {
            for (CarModel c : CarModel.values()) {
                if (text.equals(c.carModel)) {
                    return c;
                }
            }
        }
        return NOMODEL; //default
    }
}

ここで、protobuf を使用すると、.proto ファイルに入ります。

enum CarModel {
    NOMODEL = 0;
    X = 1;
    XS = 2;
    XSI = 3;
    XSI2 = 4;
}

以前の質問から、protoc によって生成された列挙型を呼び出して自分のクラスを削除できることはわかっていますが (したがって、値の定義の重複を回避できます)、どこかで (ラッパー クラスで? ラッパー列挙型クラスで?) 代替fromString()メソッドを定義する必要があります。列挙ごとに正しい文字列を返します。それ、どうやったら出来るの?

編集:以下を実装するにはどうすればよいですか:

String carModel = CarModel.XSI.toString(); これは「XS-I」を返します

と:

CarModel carModel = CarModel.fromString("XS-I.2");
4

2 に答える 2

7

これは、Protobuf の「カスタム オプション」を使用して実現できます。

import "google/protobuf/descriptor.proto";

option java_outer_classname = "MyProto";
// By default, the "outer classname" is based on the proto file name.
// I'm declaring it explicitly here because I use it in the example
// code below.  Note that even if you use the java_multiple_files
// option, you will need to use the outer classname in order to
// reference the extension since it is not declared in a class.

extend google.protobuf.EnumValueOptions {
  optional string car_name = 50000;
  // Be sure to read the docs about choosing the number here.
}

enum CarModel {
  NOMODEL = 0 [(car_name) = "NOMODEL"];
  X = 1 [(car_name) = "X"];
  XS = 2 [(car_name) = "XS"];
  XSI = 3 [(car_name) = "XS-I"];
  XSI2 = 4 [(car_name) = "XS-I.2"];
}

今Javaでできること:

String name =
    CarModel.XSI.getValueDescriptor()
    .getOptions().getExtension(MyProto.carName);
assert name.equals("XS-I");

https://developers.google.com/protocol-buffers/docs/proto#options (カスタム オプションのセクションまで少し下にスクロールします。)

于 2013-10-08T21:33:19.777 に答える
-1
CarModel carmodel =  Enum.valueOf(CarModel.class, "XS")

また

CarModel carmodel =  CarModel.valueOf("XS");
于 2013-10-08T07:28:18.933 に答える