2.8.3 union

IDL unionはファイナルJavaクラスと同じ名前が与えられ,ファイナルJavaクラスにマッピングされます。IDL unionは,次に示すコンストラクタとメソッドを提供します。

マッピングされたunion型名,または任意のフィールド名と名前の衝突がある場合,通常の名前衝突解決規則(ディスクリミネータの前にアンダースコア(_)を付ける)が使用されます。

ブランチアクセッサ,および変更メソッドがオーバーロードとなり,ブランチの後ろに名前が付けられます。アクセッサメソッドは,予想されるブランチが設定されないと,CORBA::BAD_OPERATIONシステム例外を発生させます。

ブランチに該当する複数のケースラベルがある場合,そのブランチのシンプル変更メソッドが最初のケースラベルの値に対してディスクリミナントを設定します。さらに,明示的ディスクリミネータパラメタを取る追加の変更メソッドが生成されます。

ブランチがdefaultケースラベルに該当する場合,変更メソッドはほかのどのケースラベルにも一致しない値にディスクリミナントを設定します。

ケースラベルのセットがディスクリミナントの可能値を完全に満たす場合,デフォルトケースラベルのunionを指定することは不当です。この状況を検出し,不当なコードの生成を拒否するのは,Javaコードジェネレータ(例えば,IDLコンパイラ,またはほかのツール)の責任です。

デフォルトの変更メソッドである_default( )が生成されるのは,デフォルトケースラベルが明示的に指定されていない場合と,すべてのケースラベルがディスクリミナントの可能値を完全には満たしていない場合です。_default( )メソッドは,unionの値を範囲外に設定します。

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

コードサンプル2-14 unionのHolderクラス

final public class <union_class>Holder
      implements org.omg.CORBA.portable.Streamable {
   public <union_class> value;
   public <union_class>Holder( ) {}
   public <union_class>Holder(<union_class> 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-15 IDL unionのJavaへのマッピング

/*From Example.idl:*/
module Example {
   enum EnumType {first,second,third,fourth,fifth,sixth};
   union UnionType switch (EnumType){
       case first:long win;
       case second:short place;
       case third:
       case fourth:octet show;
       default:boolean other;
   };
};

//Generated java
final public class UnionType {
   //constructor
   public UnionType( ) {...}
   //discriminator accessor
   public int discriminator( ) {...}

   //win
   public int win( ) {...}
   public void win(int value) {...}

   //place
   public short place( ) {...}
   public void place(short value) {...}

   //show
   public byte show( ) {...}
   public void show(byte value) {...}
   public void show(int discriminator,byte value) {...}

   //other
   public boolean other( ) {...}
   public void other(boolean value) {...}
   public java.lang.String to String( ) {. . .}
   public boolean equals(java.lang.Object o) {. . .}
}

final public class UnionTypeHolder {
       implements org.omg.CORBA.portable.Streamable {
   public UnionType value;
   public UnionTypeHolder( ) {}
   public UnionTypeHolder(UnionType 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( ) {...}
}