- PR -

【コードへの指摘をお願いします】RMI+Observerパターン

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-11 23:54
引用:

こくぼさんの書き込み (2007-07-11 21:15) より:
引用:

しんいさんの書き込み (2007-07-11 05:35) より:
   count c = server.new count();
...
    rface.add(client.new Receiver());


そもそもこの構文でコンパイルできましたっけ?



知らない方も多いかもしれませんがエンクロージング型のインナークラスのnewはこうなります。
エンクロージング型のインナークラスってのはstaticが付かない内部クラスのこと。今の場合は
コード:
class count extends Thread{


で宣言されていますね。

構文で言うと、
コード:
親となるインスタンス.new InnerClass();


という表記になるんですが、親となるインスタンスがthisの場合は
コード:
this.new InnerClass();


となって、ご存知の通りthisは省略可能ですから
コード:
new InnerClass();


と書けるわけです。
thisではない外部からインナークラスのインスタンス生成する場合は、
親となるインスタンスを指定する必要があるので省略できないので先のような書き方になります。

インナークラスを外部からnewするというのはちょっと例が少ないのですが、
私が昔書いたコードではComparableやIteratorを内部クラスとして数種用意した場合に
このような使い方をすることになったという例があります。
こくぼ
大ベテラン
会議室デビュー日: 2003/08/11
投稿数: 229
お住まい・勤務地: 国境の南、太陽の西。
投稿日時: 2007-07-12 09:07
引用:

nagiseさんの書き込み (2007-07-11 23:54) より:
知らない方も多いかもしれませんがエンクロージング型のインナークラスのnewはこうなります。



インナークラスのnewでしたか。そういえばSJC-Pの学習をしているときに見かけたような気がしますが、実際に使ったことがないのですっかり忘れていました。
丁寧にご指摘ありがとうございます。
余計なところで失礼してすみませんでした。
_________________
『Life's rich Tapestry!!』
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 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);
    }
  }
}

スキルアップ/キャリアアップ(JOB@IT)