2

Groovy では、マップ コンストラクターを呼び出すと、たとえば

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

プロパティ セッターが呼び出される順序を知るにはどうすればよいですか?

一部のセッターに特定のロジックを適用する必要があり、各セッターが呼び出されたときにオブジェクトに設定されるデータを知る必要があるため、これを知る必要があります。

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が何をしているのかをより深く理解できます。そのコードのセッターの1つにブレークポイントを設定すると、コールスタックにが含まれていることがわかりますMetaClassImpl.setProperties。これは、これらのプロパティがそのメソッドによって設定されていることを意味します。setProperties'コードを見ると、コンストラクターで渡されたマップをトラバースするためにマップイテレーターを使用していることが確認できます。また、Groovyは順序付けられたLinkedHashMapsをデフォルトのMap実装として使用するため、これらのプロパティはコンストラクターのマップで定義された順序で設定されると結論付けることができます:)

于 2012-05-18T05:11:17.487 に答える