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()だけです。あとの必要な機能はスーパークラスに定められています。
コンストラクタは次の三つを用意することにしました。
IllegalMovementException()
IllegalMovementException(String message)
IllegalMovementException(String message, String localizedMessage)
最初の二つはスーパークラスで処理を行なってもらえば良いだけなので
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を返すことにしました。。