2

在 Groovy 中,当我调用地图构造函数时,例如

new Player(name:'Lionel', surname:'Messi', number: 10, team:barcelona)

我如何知道调用属性设置器的顺序?

我需要知道这一点,因为我需要在我的一些 setter 中应用某些逻辑,并且我需要知道在调用每个 setter 时将在对象中设置哪些数据。

4

1 回答 1

5

使用快速脚本,它们似乎是按照传递的顺序设置的:

class Foo {
    def settersCalled = []
    def setFoo(foo) { settersCalled << 'foo' }
    def setBar(bar) { settersCalled << 'bar' }
    def setBaz(baz) { settersCalled << 'baz' }
}

assert new Foo(foo: 0, bar: 0, baz: 0).settersCalled == ['foo', 'bar', 'baz']
assert new Foo(bar: 0, foo: 0, baz: 0).settersCalled == ['bar', 'foo', 'baz']
assert new Foo(baz: 0, bar: 0, foo: 0).settersCalled == ['baz', 'bar', 'foo']

但是,您可以通过使用调试器跟踪代码来更多地了解 Groovy 正在做什么。如果您在该代码的其中一个设置器中放置断点,您会注意到调用堆栈包含MetaClassImpl.setProperties,这意味着这些属性是由该方法设置的。如果我们看一下setProperties'代码,我们可以确认它正在使用映射迭代器来遍历构造函数中传递的映射。而且,由于 Groovy 使用有序的 LinkedHashMaps 作为默认 Map 实现,我们可以得出结论,这些属性将按照它们在构造函数的映射中定义的顺序进行设置:)

于 2012-05-18T05:11:17.487 回答