IDL unionはファイナルJavaクラスと同じ名前が与えられ,ファイナルJavaクラスにマッピングされます。IDL unionは,次に示すコンストラクタとメソッドを提供します。
マッピングされたunion型名,または任意のフィールド名と名前の衝突がある場合,通常の名前衝突解決規則(ディスクリミネータの前にアンダースコア(_)を付ける)が使用されます。
ブランチアクセッサ,および変更メソッドがオーバーロードとなり,ブランチの後ろに名前が付けられます。アクセッサメソッドは,予想されるブランチが設定されないと,CORBA::BAD_OPERATIONシステム例外を発生させます。
ブランチに該当する複数のケースラベルがある場合,そのブランチのシンプル変更メソッドが最初のケースラベルの値に対してディスクリミナントを設定します。さらに,明示的ディスクリミネータパラメタを取る追加の変更メソッドが生成されます。
ブランチがdefaultケースラベルに該当する場合,変更メソッドはほかのどのケースラベルにも一致しない値にディスクリミナントを設定します。
ケースラベルのセットがディスクリミナントの可能値を完全に満たす場合,デフォルトケースラベルのunionを指定することは不当です。この状況を検出し,不当なコードの生成を拒否するのは,Javaコードジェネレータ(例えば,IDLコンパイラ,またはほかのツール)の責任です。
デフォルトの変更メソッドである_default( )が生成されるのは,デフォルトケースラベルが明示的に指定されていない場合と,すべてのケースラベルがディスクリミナントの可能値を完全には満たしていない場合です。_default( )メソッドは,unionの値を範囲外に設定します。
unionのHolderクラスも生成されます。その名前は,次のようにunionがマッピングされたJavaクラス名の後ろに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( ) {...}
}
/*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( ) {...}
}