2016-08-31 9 views
1

Apache AvroでJava定数フィールドをどのように定義しますか?Apache Avroで定数を定義する

public static final String FIELD = "field"; 
+0

[documentation](https://avro.apache.org/docs/1.7.7/api/java/constant-values.html)を見ると、その方法がわかります。また、この[documentation](https://avro.apache.org/docs/1.6.0/api/java/constant-values.html)を見てください。 –

+0

@ Skizo-ozᴉʞSあなたが私に何を見せているのかよくわかりません。これはAvro API定数です。スキーマ内で定義する方法ではありません。 – bdparrish

答えて

2

短い答えは:あなたはしないでください。 Avroはシリアライゼーションシステムです。なぜ静的フィールドが直列化されていないのかを理解するために、我々はAvroを超えて、一般的な直列化に目を向けることができます。ここからSOからのリソースのカップルです。

アブロは、静的フィールドをシリアル化しないことを証明するために、我々は、スキーマを生成するためにReflectDataを使用することができます。

import org.apache.avro.Schema; 
import org.apache.avro.reflect.ReflectData; 

public class Main { 
    public static void main(String... args) { 
     Schema schema = ReflectData.get().getSchema(Main.Foo.class); 
     System.out.println(schema); 
    } 

    static class Foo { 
     public static final String FIELD = "field"; 
    } 
} 

出力は次のとおり{"type":"record","name":"Foo","namespace":"thepackage.Main$","fields":[]}
フィールドの空の配列に注目してください。フィールド上のstatic修飾子なし

、スキーマは次のようになります。

{"type":"record","name":"Foo","namespace":"thepackage.Main$","fields":[{"name":"FIELD","type":"string"}]} 

静的フィールドをシリアライズすることは不要と望ましくない理由を上記のリンクを説明し、私はあなたがシングルと同じ効果を得ることができたとし要素enum。

+0

Javaが直列化で 'static'値をどのように処理するのかという疑問はありませんが、代わりにAvroをクラス定義言語として使用することを参照してください。あなたの答えはAvroの設計から意味があります。 – bdparrish

+0

私は、_aクラスlanguage_を定義することによって何を意味するかは完全にはわかりませんが、答えはAvroが言語を定義するクラスではないと思われます。そのホームページ[https://avro.apache.org/]によると、_Apache Avroはデータのシリアライゼーションシステムです。つまり、データシリアライゼーションシステムが言語を定義するクラスとしてどのように使用されるのか興味深いかもしれません;私はあなたが未知の領域に旅行していると思う。 – jaco0646

+0

クラス定義言語。つまり、クラス構造を定義することができるので、公開プロトコルを使用していれば、使用していた言語が何であっても、提供された '* .avsc'ファイルを利用できます。私はAvroがThriftのように一定の定義を提供していないことに驚いています。 – bdparrish

関連する問題