2011-11-29 32 views
24

¿Qué significa @ antes de un nombre de campo en Groovy? Para algunas clases soy capaz de acceder a los campos privados que no son directamente accesibles, tomemos ComposedClosure por ejemplo:símbolo Groovy @ antes de los campos

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

Su capacidad para acceder a campos privados es un error en la implementación actual de Groovy, no una característica. No deberías usarlo porque con suerte arreglarán el error en la versión 2.0 y es una mala práctica de OO –

+1

@Don No está en el calendario para 2.0, podría estar en 3.0, pero no aguantaría la respiración ya que el jurado está todavía no está claro si es un error o una característica ;-) –

Respuesta

41

Le permite anular el uso de accesos a propiedades de groovy. Si escribe:

println u.name 

groovy invocará el getter generado automáticamente Person.getName(). Si escribe:

println [email protected] 

irá directamente al campo como lo haría en Java. En el caso del cierre, parece tener un campo first pero no un accesorio correspondiente getFirst.

En el manual de groovy, está documentado como direct field access operator.

6

Significa que estás accediendo a un campo directamente, en lugar de ir a través de un captador.

Consulte Groovy operator docs, aunque no hay mucho más que decir. Aparte de probablemente evitarlo.

La razón por la que falla para un ComposedClosure es porque no hay getter para first (o second).

Cuestiones relacionadas