2.9 interface
IDLのインタフェースは,次に示す二つのJavaパブリックインタフェースにマッピングされます。
-
IDLインタフェースに宣言されたオペレーションと定数だけを格納するOperationsインタフェース
-
該当するインタフェースオペレーション,そのすべてのベースインタフェースオペレーション,およびorg.omg.CORBA.Objectを継承する,CORBAオブジェクト宣言
拡張子Helperの付いた追加Helperクラス名がインタフェース名に付加されます。Javaインタフェースはマッピングしたベースインタフェースorg.omg.CORBA.Objectを継承します。
Javaインタフェースは,マッピング後のオペレーションシグニチャを格納します。メソッドは,Javaインタフェースのオブジェクトリファレンスについて呼び出せます。
Helperクラスは静的narrowメソッドを宣言します。このメソッドによって,org.omg.CORBA.Objectのインスタンスをさらに詳細な型のオブジェクトリファレンスにナロウイングできます。オブジェクトリファレンスが要求型をサポートしていないためナロウイングに失敗すると,IDL例外CORBA::BAD_PARAMが発生します。別の種類のエラーを報告するためには,異なるシステム例外が発生します。nullのナロウイングは常にnullを返して成功します。
特別な「nil」オブジェクトリファレンスはありません。Javaのnullは,オブジェクトリファレンスに,いつでも自由に渡されます。
属性はJavaアクセッサと変更メソッドのペアにマッピングされます。これらのメソッドにはIDL属性と同じ名前があり,オーバーロードされます。IDL readonly属性に対する変更メソッドはありません。
interfaceのHolderクラスも生成されます。その名前は,次のようにインタフェースがマッピングされたJavaクラス名の後ろにHolderを付けたものです。
- コードサンプル2-20 interfaceのHolderクラス
final public class <interface_class>Holder implements org.omg.CORBA.portable.Streamable { public <interface_class> value; public <interface_class>Holder( ) {} public <interface_class>Holder( <interface_class> initial) { value = 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-21 IDL interfaceのJavaへのマッピング
/*From Example.idl:*/ module Example { interface Foo { long method(in long arg)raises(AnException); attribute long assignable; readonly attribute long nonassignable; }; }; //Generated java package Example; public interface Foo extends com.inprise.vbroker.CORBA.Object, Example.FooOperations, org.omg.CORBA.portable.IDLEntity { } public interface FooOperations { public int method(int arg) throws Example.AnException; public int assignable( ); public void assignable(int assignable); public int nonassignable( ); } public final class FooHelper { //...other standard helper methods public static Foo narrow(org.omg.CORBA.Object obj) {...} public static Example.Foo bind(org.omg.CORBA.ORB orb, java.lang.String name, java.lang.String host, com.inprise.vbroker.CORBA.BindOptions _options) {...} public static Example.Foo bind(org.omg.CORBA.ORB orb, java.lang.String fullPoaName, byte[ ] oid)) {...} public static Example.Foo bind(org.omg.CORBA.ORB orb, java.lang.String fullPoaName,byte[ ] oid, java.lang.String host, com.inprise.vbroker.CORBA.BindOptions _options) {...} public Foo read(org.omg.CORBA.portable.InputStream in) {...} public void write(org.omg.CORBA.portable.OutputStream out, Foo foo) {...} public Foo extract(org.omg.CORBA.Any any) {...} public void insert(org.omg.CORBA.Any any, Foo foo) {...} } public final class FooHolder implements org.omg.CORBA.portable.Streamable { public Foo value; public FooHolder( ) {} public FooHolder(final Foo 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( ) {...} }
- 注
-
リポジトリIDの長さが,512を2の(サーバエンジン数 -1)乗で割ったサイズ(単位:バイト)以下になるように,interfaceをIDLに記述してください。IDLで#pragmaを使用して,リポジトリIDを指定している場合も同様です。
上記のサイズを超える値を指定した場合,osagentとの通信が失敗することがあります。