自作クラスと toString()

さて、今度は先ほどのプログラムの代わりに、自作クラスを要素に入れてみましょう。まずは、ArrayList を使ってみます。

ポイントは、

  • 自作クラスの表示ってどうやるの?

です。

toString()の定義

MyPoint

public class MyPoint {
    final int x;
    final int y;
    public MyPoint(int x, int y) {
        this.x=x;
        this.y=y;
    }
    public int sum() { return x+y; }

     /* 以下をコメントアウトした場合の実行も試しましょう*/
    public String toString() {
        return "(x: " + x + ", y: " + y + ")";
    }
}
  • なんてことない、簡単なクラス。普段なら、java.awt.Point あたりを使うところ。
  • toString() は、コメントアウトした場合の実行も試しましょう。

利用側のクラス

UseSampleP0

public class UseSampleP0 {

    public static void main(String[] args){
        /* ArrayList で実験 */
        ArrayList<MyPoint> plist = new ArrayList<MyPoint>();
        addRecordSamples(plist);  /* 要素を詰める */
        System.out.println("plist: " + plist); /* 表示 */
    }

    public static void addRecordSamples(Collection<MyPoint> rcol) {
        rcol.add(new MyPoint(3,4));
        rcol.add(new MyPoint(2,18));
        rcol.add(new MyPoint(9,7));
        rcol.add(new MyPoint(2,18));
        rcol.add(new MyPoint(2,10));
    }
}
  • 今回のプログラムでは、要素表示は ArrayList, TreeSettoString() に任せてあります。

理解のまとめ

まずは、実行結果見てみましょう。

MyPoint.javatoString() をコメントアウトして実行

plist: [kobeU.cs.samplesCol.MyPoint@f62373, kobeU.cs.samplesCol.MyPoint@19189e1, kobeU.cs.samplesCol.MyPoint@1f33675, kobeU.cs.samplesCol.MyPoint@7c6768, kobeU.cs.samplesCol.MyPoint@1690726]

MyPoint.javatoString() 定義を生かして実行

plist: [(x: 3, y: 4), (x: 2, y: 18), (x: 9, y: 7), (x: 2, y: 18), (x: 2, y: 10)]

ポイント

  • MyPointtoString() を定義しないと、中身が良く分からない表示になってしまう。
  • 実は、Collection 側は、要素表示に、各要素の java.lang.ObjecttoString() メソッド呼んでいるだけ。
  • つまり、コメントアウト版では、親クラス ObjecttoString() が呼ばれている。
  • 自作クラスで toString()再定義すれば、表示方法を制御できる。
  • Integer, ArrayList, TreeSettoString() も、(どこかで)再定義されたもの。
  • これも、polymorphism の例。