クラスIllegalMovementException

------------------------------------

ルールに反する移動が指定された場合に投げる例外のクラスIllegalMovementExceptionを考えます。

例外のクラスはjava.lang.Throwableのサブクラスとして作成します。「Java言語入門」の例外処理の章を読むと、どうもjava.lang.Exceptionのサブクラスとして作成するのが良さそうです。

------------------------------------

java.lang.Exceptionにはどんなメソッドがあるんだろう」とAPIドキュメントを眺めてみると、なんとこのクラスにはコンストラクタしかありません。

そこでクラス階層をさかのぼるとjava.lang.Throwableにメソッドが定義されていました。

最初にメソッドgetMessage()が目に付きました。これはdetail messageをString型の値で返すメソッドです。detail messageはコンストラクタで

new Throwable("This is a detail message.");

と与えるようです。

どのルールに違反したかによってdetail messageを変え、そのdetail messageを持ったIllegalMovementExceptionのインスタンスを返すことにすれば、例外を受け取った側では

try {
} catch (IllegalMovementException ex) {
    System.out.err(ex.getMassage());
}

のようにどのルールに違反したかに関係なく、統一的な処理ができます

------------------------------------

国際化に伴いJDK1.1から日本語が使えるようになったので、「detail messageを日本語にしようかな」などと考えながらさらにAPIドキュメントを見るとgetLocalizedMessage()というのがありました。

どうもこれはlocalizeされたdetail messageを返すと考えて良いようです。そして「このメソッドはサブクラスでオーバーライドして使ってくれ」と書いてあります。

国際化を考えると、世界中のどの国で使用しても適切な語句が出るようにgetLocalizedMessage()を作成すべきなんでしょうが、私は日本人で日本に住んでいるので、取り敢えずgetLocalizedMessage()では日本語を返せれば良いという方針でクラスIllegalMovementExceptionを作成することに決めました(JavaのInternationalization学んだらちゃんとやります)。

------------------------------------

クラスIllegalMovementExceptionに必要なのはコンストラクタとメソッドgetLocalizedMessage()だけです。あとの必要な機能はスーパークラスに定められています。

コンストラクタは次の三つを用意することにしました。

最初の二つはスーパークラスで処理を行なってもらえば良いだけなので

public IllegalMovementException() {
    super();
}
public IllegalMovementException(String message) {
    super(message);
}

で完成です。

------------------------------------

最後の一つが日本語化に関係するところで

public IllegalMovementException(String message, String localizedMessage) {
    super(message);
    localizedDetailMessage = localizedMessage;
}

のようにインスタンス変数String localizedDetailMessageを設定するようにしました。

そしてメソッドgetLocalizedMessage()

public String getLocalizedMessage() {
	return localizedDetailMessage;
}

設定したlocalizedDetailMessageを返すことにしました。。

------------------------------------

前の項目へ次の項目へ

「メイキング・オブ・ハノイの塔」のページへ