分散オブジェクト環境を学ぶ

連載:HORBと遊ぼう(3)

オブジェクト指向にシームレスな
分散オブジェクト環境

萩本順三
HORB Openマネージャ
株式会社豆蔵
2001/1/13

 (2) HORBでオブジェクトが飛ぶ

 Javaでは、メソッドの引数や戻り値に、JDKで提供されているオブジェクトや自分で作成したオブジェクトを指定することができます。HORBで作成したリモート・クラスの引数や戻り値にも、制限付きではありますがオブジェクトを指定することができます。この制限とは、java.io.Serializableインターフェイスをimplementsしたクラスでなければならないということです。

 さて、リモート・クラスの引数や戻り値にオブジェクトを渡すということは、どういうことでしょうか?

■オブジェクトがネットワーク間を渡り歩くとは?

 すでに前回までにStringを引数や戻り値として使った例がありましたので、お分かりでしょうね。そうです、リモート・クラスに定義されたメソッドの引数や戻り値に指定されたオブジェクトは、ネットワーク間を渡り歩くオブジェクトになるのです。つまりオブジェクトが飛ぶんですよ。

 このことを実感してもらうために以下のサンプル・コードを使って解説しましょう。

■リスト5 住所録を管理するリモート・クラス

 addメソッドはネットワーク転送されてきた住所録オブジェクトをVectorに登録します。getAddressBooksメソッドは、Vectorをクライアントに戻します。

import java.util.*;
public class AddressBookStore {
  private Vector vector = new Vector();
  public void add(AddressBook book){
    System.out.println("追加>"+book);
    vector.add(book);
  }
  public Vector getAddressBooks(){
    return vector;
  }
}
リスト5 AddressBookStore.java

■リスト6 1人分の住所録クラス(ネットワーク間を転送される)

 1人分の住所録を管理するためのクラスです。toStringメソッドは、java.lang.Objectクラスのメソッドをオーバライドしたものです。このメソッドはオブジェクトの文字列表現を返すために使われ、System.out.printlnメソッドなどによって使われています。System.out.printlnメソッドは、渡されたオブジェクトにtoStringメソッドを送ることで、オブジェクトの文字列表現を取り出して標準出力に表示しています。

public class AddressBook implements java.io.Serializable{
  private String postCode;
  private String name;
  private String address;
  private String phoneNumber;
  public AddressBook(String postCode,String name,
      String address,String phoneNumber){
    this.postCode=postCode;
    this.name=name;
    this.address=address;
    this.phoneNumber=phoneNumber;
  }
  public String toString(){
    return "郵便番号["+postCode+"] 氏名["+name+ "] 住所["
    + address+"] 電話["+ phoneNumber+"]\n";
  }
}
リスト6 AddressBook.java

■リスト7 住所録を登録するクライアント

 代理オブジェクトAddressBookStore_Proxyを生成して、3人分の住所録(AddressBook)オブジェクトを実オブジェクトAddressBookStoreに送ります。その後、getAddressBooksメソッドによって全員分の住所録をVectorとして受け取り、それを表示しています。

 これらのクラスを使った、プログラムの全体的な流れを説明しましょう。まず、クライアントで作成された3個のAddressBookオブジェクトがサーバ側に転送されます。そして、AddressBookStore内のVectorオブジェクトにひとまず収納されます。

 その後、クライアントから代理オブジェクト(AddressBookStore_Proxy)のgetAddressBooksメソッドが呼び出され、Vectorオブジェクトが丸ごとクライアントに転送され、標準出力に表示されています。

 import java.util.*;
public class AddressBookClient{
  public static void main( String argv[] ){
    String host = (argv.length == 1) ? argv[0] : "localhost";
    AddressBookStore_Proxy books =
    new AddressBookStore_Proxy("horb://"+host);
    books.add(new AddressBook("832-0022","田中順三",
    "横浜市","045-001-110"));
    books.add(new AddressBook("002-0011","萩本豆蔵",
    "千駄ヶ谷","03-4001-1310"));
    books.add(new AddressBook("223-0101","豆田鈴子",
    "四谷三丁目","03-9999-1310"));
    System.out.println(books.getAddressBooks());
  }
}
リスト7 AddressBookClient.java

○コンパイル

 AddressBookStore.javaをhorbcによってコンパイルします。その後、AddressBook.javaとAddressBookClient.javaをjavacによってコンパイルします。

>horbc -delete AddressBookStore.java
compiling AddressBookStore.java
generating AddressBookStore_Proxy.java
Warning: AddressBookStore: private variable 'vector' will not be copied when this object is transfered by Proxy.
compiling AddressBookStore_Proxy.java
generating AddressBookStore_Skeleton.java
compiling AddressBookStore_Skeleton.java
>javac AddressBook.java AddressBookClient.java

○実行結果

 いつものようにHORBサーバを立ち上げて、次にクライアントからAddressBookClientをjavaにて起動します。

[HORBサーバ]
>horb
追加>郵便番号[832-0022] 氏名[田中順三] 住所[横浜市] 電話[045-001-110]
追加>郵便番号[002-0011] 氏名[萩本豆蔵] 住所[千駄ヶ谷] 電話[03-4001-1310] 追加>郵便番号[223-0101] 氏名[豆田鈴子] 住所[四谷三丁目] 電話[03-9999-1310]

[クライアント]
>java AddressBookClient
[郵便番号[832-0022] 氏名[田中順三] 住所[横浜市] 電話[045-001-110]
, 郵便番号[002-0011] 氏名[萩本豆蔵] 住所[千駄ヶ谷] 電話[03-4001-1310]
, 郵便番号[223-0101] 氏名[豆田鈴子] 住所[四谷三丁目] 電話[03-9999-1310]
]

 いかがですか。HORBでオブジェクトが飛んでいくというイメージがつかめましたか? とっても簡単なんだけど結構面白いアイデアが湧いてきませんか?

 

Index

第3回 オブジェクト指向にシームレスな分散オブジェクト環境

  (1) HORBにおける継承とは
 クラスの継承利用
 HORBリモート・クラスの継承利用
(2) HORBでオブジェクトが飛ぶ
 オブジェクトがネットワーク間を渡り歩くとは?
 

連載記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間