Groovy @символ перед полями
Что означает @перед именем поля в Groovy? Для некоторых классов я могу получить доступ к закрытым полям, которые не доступны напрямую, например ComposedClosure:
public class Person {
private String name
}
def u = new Person(name:"Ron")
println [email protected] //Ron
println u.name //Ron
a = {2} >> {3}
println [email protected] //first closure object
println a.first //runtime error
Ответы
Ответ 1
Это позволяет вам переопределить использование groovy аксессуаров свойств. Если вы пишете:
println u.name
groovy будет вызывать автоматически созданный getter Person.getName(). Если вы пишете:
println [email protected]
он перейдет непосредственно в поле, как в Java. В случае замыкания он, похоже, имеет поле first
, но не соответствующий аксессуар getFirst
.
В руководстве groovy он задокументирован как прямой оператор доступа к полю.
Ответ 2
Это означает, что вы напрямую обращаетесь к полю, а не через getter.
См. Groovy операторские документы, хотя говорить об этом не о чем. Другие, чем возможно, избегают этого.
Причина, по которой это не удается для ComposedClosure
, заключается в том, что нет никакого getter для first
(или second
).