加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Groovy中访问静态闭包的值

发布时间:2020-12-14 16:21:13 所属栏目:大数据 来源:网络整理
导读:我想在静态闭包中存储一些属性,然后在方法调用期间访问它们: class Person { static someMap = { key1: "value1",key2: "value2" } } 那么如何在Person中编写一个方法来检索这些存储的数据呢? 解决方法 对于简单的情况,您最好使用地图. 如果你真的想把它评
我想在静态闭包中存储一些属性,然后在方法调用期间访问它们:

class Person {  
static someMap = { key1: "value1",key2: "value2" }  
}

那么如何在Person中编写一个方法来检索这些存储的数据呢?

解决方法

对于简单的情况,您最好使用地图.

如果你真的想把它评估为一个闭包(可能是为了创建你自己的DSL),你需要稍微改变你的语法,就像John指出的那样.这是使用Builder类来评估传递给构建器的任何内容中的“某事”闭包的一种方法.

它使用groovy元编程来拦截缺少方法/属性的调用并将其保存:

class SomethingBuilder {
    Map valueMap = [:]

    SomethingBuilder(object) {
        def callable = object.something
        callable.delegate = this
        callable.resolveStrategy = Closure.DELEGATE_FIRST
        callable()
    }

    def propertyMissing(String name) {
        return valueMap[name]
    }

    def propertyMissing(String name,value) {
        valueMap[name] = value
    }

    def methodMissing(String name,args) {
        if (args.size() == 1) {
            valueMap[name] = args[0]
        } else {
            valueMap[name] = args
        }
    }
}

class Person {
    static something = {
        key1 "value1"              // calls methodMissing("key1",["value1"])
        key2("value2")             // calls methodMissing("key2",["value2"])
        key3 = "value3"            // calls propertyMissing("key3","value3")
        key4 "foo","bar","baz"   // calls methodMissing("key4",["foo","baz"])
    }
}

def builder = new SomethingBuilder(new Person())

assert "value1" == builder."key1"  // calls propertyMissing("key1")
assert "value2" == builder."key2"  // calls propertyMissing("key2")
assert "value3" == builder."key3"  // calls propertyMissing("key3")
assert ["foo","baz"] == builder."key4"  // calls propertyMissing("key4")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读