4

整数を拡張するいくつかのメソッドを持つクラスを開発しました。主にこれを行うことができます。

def total = 100.dollars + 50.euros

ここで、Integer.metaClass を次のように拡張する必要があります。

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

Money クラス宣言の前に、ファイルの一番下にそれを入れようとしましたが、コンパイラは Money という名前のクラスが既に存在すると言いました。このコードを実行するには void main を使用します)。

また、次のようにクラス内で静的ブロックを使用してみました。

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

これはどちらも機能しません。

3 番目の解決策は、ファイル名 (MoneyClass.groovy など) を変更し、クラス名 (class Money) を保持することですが、これは少し奇妙に思えます。

他にできることはありますか?ありがとう。

4

1 に答える 1

3

Bean TypeEnhancer.groovy など、任意のクラスの任意のメソッドに入れるだけです。

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

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

start(): を呼び出して作成および初期化するだけですnew TypeEnhancer().start();。強化を無効にするには、 を呼び出しますnew TypeEnhancer().stop();。Bean は、Spring Bean としても使用できます。

于 2009-04-24T21:07:59.907 に答える