RMIの入門テキストを3回に分けて書きます。初回はinterface編です。
RMI(Remote Method Invocation)はJavaで分散システムを作成するのに、非常に便利な仕掛けです。同じような仕組みとしては他にCORBAがありますが、RMIはコアパッケージに入っているので、余計な出費無しで利用することができます(FreeのCORBA実装もありますが)。Java以外の言語で作成されたシステムとの通信に難がありましたが、これもIIOPがサポートされる等、改善されてきています。RMIの入門ドキュメントはSunのTutorialにありますので、そちらも参照してください。
RMIは簡単に言うと他のJavaプログラム上のオブジェクトのメソッドを呼び出す機能です。ここで他のプログラムというのは、現在実行しているJava VM以外のJava VMで動いているものですので、異なるホストはもちろん、同じホスト上で動いていても、別のプロセス(Unixでいうところの)になっていることです(概ね)。
RMIでは他のプログラムにメソッドを提供する側(RMIのサーバ)と他のプログラムのメソッドを呼び出す側(RMIのクライアント)との間は、interfaceを介しています。そのため、RMIのサーバ側ではinterfaceをimplementsしていさえすれば、後で実装を変えたり、他のinterfaceもimplementsしたり、といったことをクライアント側とは独立に行うことができます。
RMIのプログラムを作成する手順としては、
import java.rmi.Remote; import java.rmi.RemoteException; public interface ServerEnvironment extends Remote { public String getJavaVersion() throws RemoteException; }てな感じでしょうか。
RMI用のinterfaceはjava.rmi.Remoteをextendsする必要があります。java.rmi.Remoteはメソッドが定義されていない空のinterfaceですから、何も考えずにextends java.rmi.Remoteを書けばよいでしょう。
一方RMI用のinterfaceのメソッドのシグネチャに使用できるのは、基本データ型(intやlong等)、java.io.Serializableをimplementsしているオブジェクト、またはリモートオブジェクトのinterfaceとなっています。
基本データ型は何も考える点はありませんし、java.lang.Stringの様に、Javaのコアパッケージの大抵のクラスはSerializableを直接的あるいは間接的にimplementsしていますので、最初の2つの制限は気にはなりません。注意すべき点としては、RMIでは通常のローカルメソッド呼び出しと異なり、引数が値渡しになる点です。
ローカルメソッドの様に参照渡しと同じことをやりたい場合はリモートオブジェクトを渡すことになります。異なるVM上で同じオブジェクトを参照することはできないので、こうした細工が必要になるわけです。