在 Groovy 中,当我调用地图构造函数时,例如
new Player(name:'Lionel', surname:'Messi', number: 10, team:barcelona)
我如何知道调用属性设置器的顺序?
我需要知道这一点,因为我需要在我的一些 setter 中应用某些逻辑,并且我需要知道在调用每个 setter 时将在对象中设置哪些数据。
在 Groovy 中,当我调用地图构造函数时,例如
new Player(name:'Lionel', surname:'Messi', number: 10, team:barcelona)
我如何知道调用属性设置器的顺序?
我需要知道这一点,因为我需要在我的一些 setter 中应用某些逻辑,并且我需要知道在调用每个 setter 时将在对象中设置哪些数据。
使用快速脚本,它们似乎是按照传递的顺序设置的:
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 实现,我们可以得出结论,这些属性将按照它们在构造函数的映射中定义的顺序进行设置:)