今日は小ネタで。
前回のFraction モジュールに、toString() という関数を追加するというお話を。
Fraction の分子/分母の内容を書き出すのに、getNumerator() とgetDenominator() という関数をそれぞれ使ってましたが、それをいちいち使うのは面倒なので、通常のプログラミング作業ではそのための関数を作ることが多いです。
Fraction の場合は書き出す内容が2つの変数だけなので手間的にはたいしたことが無いんですが、これがたくさんの内部状態を持つようなモジュールだった場合、デバッグとかをするための内容書き出しの関数がある方がかなり便利なわけで。
そういうときには、大抵、toString() という関数を作ります。
ただ、実はtoString() という関数、Java の基本的な実装の大元(Object)に定義済みでして、自分で書かなくても一応、使うことが出来ます。
例えば、前回のFractionTest モジュールをtoString() を使ったものに書き換えると、以下のような感じになりますね。
package org.dmwp.math; class FractionTest { public static void main(String[] args) throws Exception { Fraction fraction = new Fraction(1, 2); //初期化 System.out.println("result: " + fraction.toString()); // 内容表示 } }
元々のtoString() の機能を使った場合(Object の元々の実装を用いた場合)、上記の結果は以下のようになります。
result: org.dmwp.math.Fraction@1cd2e5f
@の前側はクラス名、後ろ側はインスタンスのハッシュ値が書いてあるような、そんな記述です。
上記のデフォルト実装そのままだとデバッグでは使いづらいので、以下のような形で実装を書き換えてやります。
→ソースコード
public String toString(){ StringBuffer sb = new StringBuffer(); sb.append(numerator).append("/").append(denominator); return sb.toString(); }
numerator とdenominator の値を、「/」(スラッシュ)で区切った形で書き出すという感じにしてみました。一般の数学での表記に近い形ですね。
そうすると、さっきのFractionTest の実行結果は以下のようになります。
result: 1/2
以後はこういう感じで実行結果を表示させれば分かりやすいような気もしますね。
ところで、toString() という関数はJava のかなり大元のあたりの実装ルールにあるものなので、結構汎用的なものでもあります。
その一例というわけでもないのですが、文字列の結合式("result: " + fraction.toString()とか)の場合、toString() がデフォルトで呼ばれるので、プログラムの記述では省略してしまって構わないというルールもあったります。
つまり先程のFractionTest モジュールの結果表示部分は、以下のように書いても良いわけです。
→ソースコード
System.out.println("result: " + fraction); // 内容表示
実行結果は、さっきのものと同じです。