数字において、ゼロの発見の偉大さはみな認めるところでしょう。
ないことを表すというのは非常に利便性の高い方法です。
デザインパターンにはNullPobjectパターンというものがあります。
これはオブジェクト指向でのゼロにまつわる工夫ですが、
ジェネリクスでも型がvoidであることを表現する方法があります。
Voidを表すクラス java.lang.Void
JavaにはVoidを表現するための
java.lang.Void
クラスが存在します。
このクラス、とくにメソッドも定義されていなければ、コンストラクタも定義されていないクラスです。
new してインスタンスを作ることさえできません。
Void クラスは、インスタンスを生成できないプレースホルダーとしてのクラスであり、Java キーワード void を表す Class オブジェクトへの参照を保持するのに使用されます。
intのラッパーであるIntegerと同等で、voidのラッパークラスという位置付けです。
リフレクションで用いる
リフレクションでプリミティブ型を扱う場合、ラッパークラスのTYPEフィールドを利用します。
Method method = List.class.getMethod("get", Integer.TYPE);
このコード例では引数がint型であることを表しています。
voidの場合は引数では使われることがないのでreturn値の型の確認ぐらいにしか使うことはありません。
Method method = Hoge.class.getMethod("wait", new Class[0]);
Class c = method.getReturnType();
System.out.println(c == Void.TYPE);
メソッドの戻り値がvoidであることをVoid.TYPEと比較することで確認しています。
ジェネリクスで用いる
ジェネリクスでは型Voidを使って、戻り値が帰る場合と帰らない場合を一緒くたに扱うことができます。
最近使った例ではGoFデザインパターンのVisitorパターンの戻り型ですね。
Javaの構文解析で用いるCompiler Tree APIで構文解析木を走査するための
TreeVisitor
などが使用例としては適切でしょう。
static class TreeVisitorImpl implements TreeVisitor<Void, Hoge> {
public Void visitClass(ClassTree node, Hoge p) {
...
戻り値を返す必要のないVisitorの実装であれば戻り型のジェネリクス型パラメータにVoidを指定します。
こうすることで戻り値がないことを表現するのです。
もっとも、voidを表す定数がないので、実装ではreturn nullとしなければいけないところが滑稽ではあるのですが。
投稿日時 : 2008年3月11日 19:56