このブログ投稿を拡張して、カテゴリを使用して、javax.measure
(JSR-275) クラスで使用する単純な DSL を作成しようとしています (時間間隔の TimeCategory に似ています)。
ただし、使用可能なメソッド (getMeter、getMilliMeter、getKelvin、getSecond など) ごとに定型コードを追加したくありません。getProperty(String)
メソッドをオーバーライドすればうまくいくと思っていたのですが、残念ながらgetProperty
、プロパティに直接アクセスするときに、カテゴリで定義されたメソッドが使用されていないようです。
以下は、デモ用の簡略化されたコードです。import javax.measure.unit.Unit; import javax.measure.Measure;
@Category(Number)
class LengthCategory {
public Measure<BigDecimal, Length> getProperty(String unit){
return Measure.valueOf(this,Unit.valueOf(unit));
}
}
use(LengthCategory){
println 3.getProperty("m") // this works
println 3.m // this reports a non-exisiting property
prinlln 3.'m' // as does this
}
ランタイム オブジェクトにプロパティを動的に追加する他の方法 (Expando
サブクラス化GroovyInterceptible
、ミックスイン、その他のメタクラス操作など) は実行できないと仮定すると、可能性のあるすべてのユニットと SI プレフィックスの組み合わせに対してゲッターを手動でコーディングする必要はありません。測定用の DSL を作成する方法は明らかに他にもありますが、それでもこの方法が機能しない理由を理解したいと思います。
getProperty
カテゴリのメソッドが使用法をオーバーライドしない理由を誰かが説明できます.propertyName
か? 実行時にメタクラスを使用してプロパティ名を解決する際に重要な点が明らかに欠けています。