0

ExpandoMetaClass を使用して静的メソッドを動的に追加できます。この ExpandoMetaClass を Singleton オブジェクトで使用し、その中にオーバーロードされた静的関数を使用するにはどうすればよいですか。サンプル プログラムを ExpandoMetaClass を使用して書き直す必要があるとしましょう。

@Singleton
class testA {
    def static zMap = [:]

    static def X() {
        Y()
    }

    static def Y() {
    }

    static def X(def var) {
        Y(var)
    }

    static def Y(def var) {
        zMap.put(var)
    }
}
4

1 に答える 1

2

シングルトンを使用する理由の 1 つは、クラスに静的な状態とメソッドを持たないようにすることです。を使用している場合@Singleton、静的メソッドまたはフィールドを使用する理由はありません。シングルトンの使用方法は次のとおりです。

@Singleton class TestA {
    def someField = "hello"
    def methodX() {
        someField
    }
}

println TestA.instance.methodX()

次のように ExpandoMetaClass を使用してシングルトンを拡張できます。

TestA.instance.metaClass.newMethod = { -> "foo" }
TestA.instance.metaClass.methodX = { -> "goodbye" }

println TestA.instance.newMethod()
println TestA.instance.methodX()

本当に静的メソッドが必要な場合は、次のようにすることができます。

TestA.metaClass.static.methodY = { -> "I am static" }
println TestA.methodY()

インスタンスの metaClass ではなく、クラスの metaClass をオーバーライドする場合、インスタンスが既に作成されている場合はインスタンスに適用されないことに注意してください。この使用@Singleton(lazy = true)を回避するには、インスタンスにアクセスする前に metaClass をオーバーライドします。

于 2011-10-25T18:09:55.747 に答える