読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Groovyでクラスにプロパティをくっつける

Groovy DSLs MOP

はじめに

プロパティは

オブジェクト.プロパティ

の形式でアクセス可能なものです。Groovyの場合は引数を取らないクロージャとして定義することができます。

サンプルコード

解説

プロパティをくっつける方法は二つあります。

その1. ゲッターで定義
Object.metaClass.getTwice = { ->
  delegate * 2
}

このように getTwice と定義しておくと、Object.twice のようにプロパティっぽくアクセスできる。実際はgetTwiceを呼び出しているのでプロパティではないのだが、「っぽく」使える=プロパティだ!がGroovyの精神だからこれでいい。

その2. getPropertyで定義

さてもう一つ。getPropertyという名前で定義すると MissingPropertyException(在りもしないプロパティにアクセスしようとしたよね例外)が投げられた際に呼び出されるようになります。

Number.metaClass.getProperty = { propName ->
  switch (propName) {
    case 'percent' : return delegate / 100
  }
  delegate."$propName"()
}
元の実装は汚さないように

switchの中で全てのケースにマッチしなかった場合は

  delegate."$propName"()

が呼び出されて元の名前で呼び出しに行きます。例えばNumberにabs()というメソッドは元から定義されていますのでこれはこのまま呼び出されて欲しいわけです。それでも名前が見つからなかった場合は元々の動きと同様にMissingMethodExceptionが投げられます。

assert 100.percent == 1
assert (-100).abs == 100 // original method is not dirty.
100.hoge // => throws groovy.lang.MissingMethodException