0

Java の RMI 機能を試すための簡単な例を作成しました。それはかなりいいです。しかし、LinkedList オブジェクトを返すリモート メソッドを呼び出して、リストに要素を追加すると、何も起こりません。要素は追加されません。以下のコードを参照してください。

サーバー上のインターフェイスと実装 (リモート オブジェクト):

public interface FooBar extends Remote {
    List<Object> getList() throws RemoteException;
}

public class FooBarImpl extends UnicastRemoteObject implements FooBar {

    private static final long serialVersionUID = -200889592677165250L;
    private List<Object> list = new LinkedList<Object>();

    protected CompanyImpl() throws RemoteException { }

    public List<Object> getList() { return list; }

}

バインドするコード (サーバー):

Naming.rebind("//" + hostname + "/foobar", new FooBarImpl());

クライアントコード:

FooBar foo = (FooBar) Naming.lookup("//" + hostname + "/foobar");
foo.getList().add(new String("Bar"));

System.out.println(foo.getList().size());

出力は の0代わりになり1ます。したがって、私の簡単な質問は、メソッドを使用せずに修正するadd方法です (addサーバー側のメソッドを使用すると機能するため)。

編集1: このコードはかなりうまく機能します:

public class FooBarTest {

    static class FooBarImpl {
        public List<Object> list = new LinkedList<Object>();
        public List<Object> getList() { return list; };
    }

    public static void main(String[] args) {
        FooBarImpl test = new FooBarImpl();

        test.getList().add(new String("Foo"));
        System.out.println(test.getList().size()); // = 1
    }

}

EDIT 2:このコードも機能します (ただし、EDIT 1 の単純なコードを複製しようとしています):

@Override
public void add(Object o) throws RemoteException {
    list.add(o);
}

FooBar foo = (FooBar) Naming.lookup("//" + hostname + "/foobar");
foo.add(new String("Bar"));

System.out.println(foo.getList().size()); // == 1
4

1 に答える 1

0

出力は 1 ではなく 0 になります

これは、経由で取得Barした匿名Listオブジェクトに要素を追加しているが、経由で再度取得しfoo.getList()た新しいオブジェクトのサイズを出力しているためです。これは次の行に空です:Listfoo.getList()

System.out.println(foo.getList().size());

次のコードを使用する必要があります。

List<Object> list = (List<Object>)foo.getList();
list.add(new String("Bar"));

System.out.println(list.size());
于 2013-07-03T19:05:31.963 に答える