Groovyでの null (ナル) オブジェクトは, org.codehaus.groovy.runtime.NullObjectの (唯一の) インスタンスです.
で, NullObjectの中身を見てみると, Object invokeMethod(String name, Object args) の中で,
throw new NullPointerException("Cannot invoke method " + name + "() on null object");
しています.
これこそ我々がしょっちゅう見る, あの「文字列」の本体なのですね.
でもさ, nullにメッセージを送ったらこんな文字列が返ってくるなんて不合理だと思いませんか? オブジェクト指向以前の「関数呼び出し」の臭いが芬々と漂っているようです.
nullに何かを依頼したら, 無視して欲しい (つまり単にnullを返して欲しい) ... と自分は強く思うわけです. Objective-Cの実装はそうなっていたと思います.
# まぁそのために?.演算子があるわけですが:-)
というわけで, NullObjectのinvokeMethodを上書きしたいと思うのですが...
まずはmixinを使ってみましょうか.
class NullMixin { Object invokeMethod(String name, Object args) { return null; } }
org.codehaus.groovy.runtime.NullObject.mixin(NullMixin)
だめですねぇ. では次に, ExpandoMetaClass (EMC) を.
org.codehaus.groovy.runtime.NullObject.metaClass.invokeMethod = { String name, Object args -> null }
やっぱだめでした...