2017-04-28 2 views
1

特定のcom.google.protobuf.Descriptors.DescriptorのクラスのnewBuilder()を作成する必要があります。com.google.protobuf.Descriptors.Descriptorを使用して新しいビルダーを作成

私は以下のプロトコルのためのGoogleのプロトバッファを使用してjarファイルを作成しました:

message Foo 
{ 
    optional uint32 id = 1; 
    optional string fooName = 2; 
} 
message Bar 
{ 
    optional uint32 id = 1; 
    optional string barName = 2; 
} 

Java側からは、私はnewBuilderを(作成する必要がある記述に基づきます)。たとえば :

Message.Builder message; 
    if(Descriptor.getName().equals("Foo")) 
     message = Foo.newBuilder(); 
    if(Descriptor.getName().equals("Bar")) 
     message = Bar.newBuilder(); 

しかし、私はもしそうでないか、スイッチケースのために行くにしたくありません。 また、DynamicMessageを使用して他の方法で試してみました。

Message.Builder message = DynamicMessage.newBuilder(descriptor); 

しかし、この場合には、私ははFooまたはバークラスにそれをキャストすることはできませんよ。 DescriptorやDescriptorの名前を使ってnewBuilder()を作成する方法はありますか?

盲目的に私はこのような指定されたクラス名のnewBuilderを()が必要です。

Message.Builder message = SomeUtilClass.getNewBuilder("Foo"); 
+0

を、私はそれはむしろその記述より ')' Foo.getDefaultInstanceを(周りに合格する方が簡単だということを発見する傾向があります。そのビルダーとその記述子の両方を取得できます。 –

+0

実際に私の問題は、私はそこに実際のFooやBarを持っていないということです。私はFooまたはBarのDescriptorしか持っていません。その記述子を使用して、私は新しいビルダーを作成する必要があります。現在、if else条件を使用して新しいビルダーを作成しています。私はコードを最小化したい。 – Prasath

+0

私はあなたができるならば、Descriptorを渡さないで、プロトタイプのデフォルトインスタンスを代わりに渡すのです。なぜならそれはより多くの型情報を持っているからです。 b)ディスクリプタとビルダーを取得できます。記述子を渡すという設計は、必要以上に難しくなります。 –

答えて

0

あなたはDescriptorからBuilderを作成することはできません。 Descriptorには、すべてDescriptorインスタンスが同じクラス(it's final)であるため、作成する必要のあるプロトタイプ(またはビルダー)クラスの型情報はありません。

Descriptorでしか作業できない場合、if/elseはおおよそ良好な状態になります。 (私はおおまかに言えば、マップやスイッチでそれを行うことができますが、基本的に同じです)。

より良いアプローチは、作成しようとしているプロトのインスタンス(またはそのプロトの他のインスタンスですが、デフォルトインスタンスは取得するのが最も簡単です)で作業することです。 Messageからあなたがビルダーと記述の両方を得ることができます

Message prototype = Foo.getDefaultInstance(); // Or Bar.getDefaultInstance(). 

ので:

Message.Builder builder = prototype.newBuilderForType(); 
Descriptor descriptor = prototype.getDescriptorForType(); 
+0

はDefaultInstanceで試してみます。 – Prasath

+0

Blindlyこのようなクラス名のnewBuilder()が必要です Message.Builder message = SomeUtilClass.getNewBuilder( "Foo"); – Prasath

+0

そして、 'SomeUtilClass.getNewBuilder'は現在のようなif/elseチェーンが必要です。またはスイッチ。または地図。それは 'Descriptor'だけを持つよりもさらに悪いです。 –

関連する問題