そんなことはできません。デザインを調整する必要があります。幸いなことに、デザインをあまり調整する必要はないと思います。
重要なことは、すべてのオブジェクトがリモート オブジェクトかローカル オブジェクトかを判断できることです。リモート オブジェクトへの呼び出しはサーバーに送られますが、ローカル オブジェクトへの呼び出しはローカルのままです。両方になりたいオブジェクトが 1 つある場合は、それを 2 つに分割する必要があるため、ローカル部分とリモート部分があります。クライアントにとって便利なインターフェイスを維持するために、リモート オブジェクトをローカル オブジェクトの背後に隠すことができます。
これを行う方法のスケッチを次に示します。
public interface RemoteDatabase extends Remote {
public void insertData(String data) throws RemoteException;
}
public class RemoteDatabaseImpl implements RemoteDatabase {
@Override
public void insertData(String data) throws RemoteException {
// whatever
}
}
public class Database implements Serializable {
private final RemoteDatabase remote;
private final String property;
public Database(RemoteDatabase remote, String property) {
this.remote = remote;
this.property = property;
}
public String getProperty() {
return property;
}
public void insertData(String data) throws RemoteException {
remote.insertData(data);
}
}
サーバー上に のインスタンスを作成するときは、実際のものではなく、実装用のスタブDatabase
を与える必要があることに注意してください(私はそう思います)。RemoteDatabaseImpl
オブジェクトの関係を強化するために、これらに同じインターフェースを実装させることもできます。このようなもの:
public interface RemoteDatabase extends Remote {
public String getProperty() throws RemoteException;
public void insertData(String data) throws RemoteException;
}
public class RemoteDatabaseImpl implements RemoteDatabase {
@Override
public void insertData(String data) throws RemoteException {
// whatever
}
@Override
public String getProperty() {
return "whatever";
}
public Database toLocal() throws NoSuchObjectException {
return new Database((RemoteDatabase) PortableRemoteObject.toStub(this), getProperty());
}
}
public class Database implements RemoteDatabase, Serializable {
private final RemoteDatabase remote;
private final String property;
public Database(RemoteDatabase remote, String property) {
this.remote = remote;
this.property = property;
}
@Override
public String getProperty() {
return property;
}
@Override
public void insertData(String data) throws RemoteException {
remote.insertData(data);
}
}