2011-11-09 12 views
0

enumの値はどのように計算されますか?コンパイラはそれに静的な値を与えますか?どのような価値がありますか?Java enumの値

私が尋ねる理由は、tcp(または任意のプロセス間)接続よりもenum値を使用した場合の結果がどのようなものになるのだろうと思っていたからです。 (列挙型の値によって私はEnum.VALUEを意味します)明らかに、各列挙型のあらかじめ決められた値を知っていなければ、別の言語のプログラムと互換性のあるパケットを構築することはできません。それで、それぞれの「本当の」価値を理解することは可能ですか?そして、同じenumの "クラス"ファイルを使用する2つのJavaプログラムがお互いを理解するでしょうか?

これは純粋に理論的なものであり、叱責はしないでください。しかし、ポインタは良いです。

答えて

0

Javaコンパイラによって与えられたenumのpre-assinged値には依存しないでください。異なる言語は、列挙型を扱う異なるスキームを持っています。 Javaでは、列挙型はクラスとオブジェクトのように扱うことができます(正確には同じ目的ではありません)。したがって、列挙型にコンストラクタを作成し、列挙型を必要な値に初期化できます。ここではかなり明確な例である:

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

2

あなたはEnum.ordinal()メソッドは、クラスファイル内のEnum宣言の順序によって決定された数値定数値を返すことを読み取ることができEnum JavaDocを参照する場合。

public enum Fruit{ 
    APPLE, // APPLE.ordinal() == 0 
    ORANGE;// ORANGE.ordinal() == 1 
    PEAR, // PEAR.ordinal() == 2 
} 

しかし、我々はそのアルファベットの位置にBANANAを追加した場合、それらに依存している任意のコードを破り、値がどう変化するかを参照してください:

例えば

は、アルファベット順にこれらのenum定数を考えます

public enum Fruit{ 
    APPLE, // APPLE.ordinal() == 0 
    BANANA,// BANANA.ordinal() == 1 
    ORANGE;// ORANGE.ordinal() == 2 
    PEAR, // PEAR.ordinal() == 3 
} 

これは、同じバージョンのソースコードを使用している限り、同じ基本値に頼ることができ、他のオプションがない場合に使用できることを意味します。私はあなたのコードを列挙型の順序に依存させることでコードをより壊れ易くするため、序数の値を頼りにしないで既存の列挙型の定数を挿入することができます。

投稿する前にJavaDocsを完全に読んでいないという軽度の叱責を受け入れるのですか? :)

2

Javaの列挙型は、Javaが序数を呼び出す整数参照を持ちます。たとえば、yourEnumVariable.ordinal()を実行すると、enum変数のint値を取得できます。数字は、リストの最初の数字が0、2番目の数字1のように割り当てられます。

しかし、あなたのケースでは、enumの内部表現が何であるか心配するべきではないように思えます。情報を転送するために使用するプロトコルの種類を決める必要があります。その後、enum値を転送する方法について考えることができます。おそらく、プロトコルをJavaからプロトコルにマッピングするためのマッピングクラスをいくつか構築する必要があります。

+0

+1はプロトコルとマッピングについて示します。これは私の答えよりも優れています – gigadot

4

説明したように、基本的な実装に依存しないでください。代わりに、この種の情報を管理下に格納するようにenumを設計します。ビットパターンをレジスタに書き込むことで、エンベデッドコントローラに送るコマンドが3つあるとします。あなたはあなたのコマンドの高レベル表現を与えるために列挙型を使用したいのですが、いくつかの点で、あなたはそれらの厄介なビットパターンを必要とする:

public enum EmbeddedControllerCommand { 

    FOO(0x001), BAR(0x010), BAZ(0x100); 

    private int bitPattern = 0; 

    EmbeddedControllerCommand(int bitPattern) { 
     this.bitPattern = bitPattern; 
    } 

    public int getBitPattern() { 
     return this.bitPattern; 
    } 

} 

だけFOOコマンドのコマンドパターンを取得するためにEmbeddedControllerCommand.FOO.getBitPattern()を呼び出します。