2.8.1 enum

IDL enumは,value( )メソッド,ラベルごとの二つの静的データメンバ,整数変換メソッド,およびプライベートコンストラクタを宣言する,enum型と同名のJavaファイナルクラスにマッピングされます。JavaファイナルクラスにマッピングされるIDL enumの例を次に示します。

コードサンプル2-9 JavaファイナルクラスにマッピングされるIDL enum

// Generated java

public final class <enum_name> {
   //one pair for each label in the enum
   public static final int _<label> = <value>;
   public static final <enum_name> <label> =
     new <enum_name>(_<label>);

   public int value( ) {...}

   //get enum with specified value
   public static <enum_name> from_int(int value);

   //constructor
   protected <enum_name>(int) {...}
}

メンバの一つは,IDL enumラベルと同名のpublic static finalです。そのほかのメンバは,先頭にアンダースコア(_)を付けられ,switch文で使用されます。

value( )メソッドは整数値を返します。値は,0から順に割り当てられます。enumにvalueと名づけられたラベルがある場合,Javaのvalue ( )メソッドとの衝突はありません。

enumのインスタンスは一つだけです。一つのインスタンスしかないので,ポインタ等価テストが正しく動作します。つまり,デフォルトjava.lang.Objectインプリメンテーションのequals( ),およびhash( )が,自動的にenumのシングルトンオブジェクトで正しく動作します。

enumのJavaクラスには追加メソッドfrom_int( )があり,これはenumを指定された値で返します。

enumのHolderクラスも生成されます。その名前は,次のようにenumのマッピングされたJavaクラス名の後ろにHolderを付けたものです。

コードサンプル2-10 enumのHolderクラス

public class <enum_name>Holder implements
    org.omg.CORBA.portable.Streamable {
   public <enum_name> value;
   public <enum_name>Holder( ) {}
   public <enum_name>Holder(<enum_name> initial) {...}
   public void _read(org.omg.CORBA.portable.InputStream i)
       {...}
   public void _write(
                   org.omg.CORBA.portable.OutputStream o)
       {...}
   public org.omg.CORBA.TypeCode _type( ) {...}
}

コードサンプル2-11 enumのJavaにマッピングされたIDL

//IDL
module Example {
   enum EnumType {first,second,third };
};

//generated Java
public final class EnumType
       implements org.omg.CORBA.portable.IDLEntity {
   public static final int _first =0;
   public static final int _second =1;
   public static final int _third =2;

   public static final EnumType first =
                                    new EnumType(_first);
   public static final EnumType second =
                                   new EnumType(_second);
   public static final EnumType third =
                                    new EnumType(_third);
   protected EnumType(final int _vis_value){...}

   public int value( ){...}
   public static EnumType from_int (final int _vis_value)
                                                    {...}
   public java.lang.String toString( ){...}
}

public final class EnumTypeHolder
       implements org.omg.CORBA.portable.Streamable {
   public OtherExample.EnumType value;
   public EnumTypeHolder( ){...}
   public EnumTypeHolder(
              final OtherExample.EnumType _vis_value){...}
   public void _read(
           final org.omg.CORBA.portable.InputStream input)
       {...}
   public void _write(
         final org.omg.CORBA.portable.OutputStream output)
       {...}
   public org.omg.CORBA.TypeCode _type( ){...}
   public boolean equals(java.lang.Object o) {...}
}