2009-04-24 11 views
3

それは主に私はこれを行うことができます、整数を強化いくつかのメソッドを持つクラスをIを開発しました:GroovyのはExpandoメタクラス

def total = 100.dollars + 50.euros 

今、私はこのような何かやっInteger.metaClassを拡張する必要があります。

Integer.metaClass.getDollars = {-> 
    Money.Dollar(delegate) 
} 

Moneyのクラス宣言の前にファイルの一番下に置いてみましたが、コンパイラは名前付きクラスがすでに存在すると言いますが、なぜ起こるのか分かります(groovyはファイルの名前このコードを実行するためには空の静的voidをメインとします)。

私はまた、このようなクラス内の静的なブロックを使用してみました:

static { 
    Integer.metaClass.getDollars = {-> 
     Money.Dollar(delegate) 
    } 
} 

このどちらの作品を。

3番目の解決策は、ファイル名(MoneyClass.groovyなど)を変更し、クラス名(クラスMoney)を保持することですが、それはちょっと変わったようです。

他に何かできますか?ありがとう。

+1

Dang!私はGroovyを学ぶ必要があります。 – bgw

答えて

2

だけで任意のクラスのいずれかの方法で多分豆TypeEnhancer.groovyをそれを置く:

public class TypeEnhancer { 
    public void start() { 
    Integer.metaClass.getDollars() = {-> Money.Dollar(delegate) } 
    } 

    public void stop() { 
    Integer.metaClass = null 
    } 
} 

だけで作成し、開始()を呼び出すことによってinitalize:new TypeEnhancer().start();を。 拡張機能を無効にするには、new TypeEnhancer().stop();に電話してください。 BeanはSpring Beanとしても使用できます。

+0

ありがとうが、私はexpandosを初期化するために奇妙なメソッドを呼び出さないことを好むだろう。また、metaClass = nullを実行すると、後でバグを作成するように見えるかもしれません(groovyはinternalClassフィールドを使用します)。 –

+0

guillaume Laforgeが2週間前に彼と出会った時、metaClass = nullはすべての拡張を削除するための推奨された方法です。 –

関連する問題