- - PR -
【コードへの指摘をお願いします】RMI+Observerパターン
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-11 23:54
知らない方も多いかもしれませんがエンクロージング型のインナークラスのnewはこうなります。 エンクロージング型のインナークラスってのはstaticが付かない内部クラスのこと。今の場合は
で宣言されていますね。 構文で言うと、
という表記になるんですが、親となるインスタンスがthisの場合は
となって、ご存知の通りthisは省略可能ですから
と書けるわけです。 thisではない外部からインナークラスのインスタンス生成する場合は、 親となるインスタンスを指定する必要があるので省略できないので先のような書き方になります。 インナークラスを外部からnewするというのはちょっと例が少ないのですが、 私が昔書いたコードではComparableやIteratorを内部クラスとして数種用意した場合に このような使い方をすることになったという例があります。 | ||||||||||||||||||||||||
|
投稿日時: 2007-07-12 09:07
インナークラスのnewでしたか。そういえばSJC-Pの学習をしているときに見かけたような気がしますが、実際に使ったことがないのですっかり忘れていました。 丁寧にご指摘ありがとうございます。 余計なところで失礼してすみませんでした。 _________________ 『Life's rich Tapestry!!』 | ||||||||||||||||||||||||
|
投稿日時: 2007-07-12 11:38
あしゅさん、nagiseさん、こくぼさんありがとうございました。
特にあしゅさんのアドバイスが決め手で、思惑通りの挙動をしてくれました。本当にありがとうございました。 Iteratorの使い方も初歩的な間違いをしていましたので、完成したコードを書いておきます。 ・リモートインターフェイス public interface Rface extends Remote{ void add(Receive receive) throws RemoteException; } ・Observerインターフェイス public interface Receive extends Remote { void update(String str) throws RemoteException; } ・サーバー(5秒に一回、オブザーバーを呼び出して更新します) public class Server extends UnicastRemoteObject implements Rface{ private static final long serialVersionUID = 858454002682425130L; public Server() throws RemoteException {} ArrayList<Receive> list = new ArrayList<Receive>(); public void add(Receive receive) throws RemoteException { list.add(receive); } public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { Server server = new Server(); Naming.rebind("rmi://127.0.0.1/Server",server); count c = server.new count(); c.start(); } catch (Exception e) {} } class count extends Thread{ public void run(){ int x=0; while(x<100){ x++; Iterator it = list.iterator(); while(it.iterator().hasNext()){ ((Receive)it.iterator().next()).update("update"+x); } try {sleep(5000);} catch (InterruptedException e) {} } } } } ・クライアント public class Client { private static final long serialVersionUID = 1L; public Client2() throws RemoteException{} public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { Rface rface = (Rface)Naming.lookup("rmi://127.0.0.1/Server"); Client client = new Client(); rface.add(client.new Receiver()); while(true){ try { Thread.sleep(3000); } catch (InterruptedException e) {} } } class Receiver extends UnicastRemoteObject implements Receive,Serializable{ private static final long serialVersionUID = 1L; public void update(String str) { System.out.println(str); } } } |