2009-09-23 12 views
6

Anteriormente, pensé que una propiedad en Groovy se indica por la omisión de una palabra clave de ámbito. En otras palabrasGroovy property definition

class Test { 
    def prop = "i am a property" 
    public notProp = "i am not" 
} 

Sin embargo, parece que estoy incorrecta acerca de esto, debido a las siguientes impresiones de guión "val getter"

class Foo { 
    public bar = "init val" 

    public getBar() { 
    "getter val" 
    } 
} 

println new Foo().bar 

El hecho de que el comprador se invoca cuando se accede bar sugiere que bar es una propiedad en lugar de un campo. Entonces, ¿cuál es exactamente la diferencia entre los campos y las propiedades en Groovy?

Gracias, Don

Respuesta

3

Con el fin de acceder a un campo directamente hay que anteponer con un signo @:

assert "getter val" == new Foo().bar 
assert "init val" == new Foo()[email protected]r 

Que la forma corta de new Foo().getBar() obras, aunque bar no es una propiedad, sigue siendo conciso desde mi punto de vista.

Por el contrario, no puede hacer una llamada al foo.setBar("setter val"), pero podría en caso de que haya definido bar como una propiedad sin el modificador de acceso.

1

El uso de un modificador suprime la creación de una propiedad. Lo que le confunde es que . parece estar de regreso en un acceso de campo cuando no existe tal propiedad.

 
$ groovysh 
Groovy Shell (2.1.0, JVM: 1.7.0_21) 
Type 'help' or '\h' for help. 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
groovy:000> class A { def a = "foo" }; 
===> true 
groovy:000> new A().getA() 
===> foo 
groovy:000> new A().a 
===> foo 
groovy:000> new A().properties 
===> {class=class A, a=foo} 

Pero:

 
groovy:000> class A { public def a = "foo" }; 
===> true 
groovy:000> new A().getA() 
ERROR groovy.lang.MissingMethodException: 
No signature of method: A.getA() is applicable for argument types:() values: [] 
Possible solutions: getAt(java.lang.String), grep(), grep(java.lang.Object), with(groovy.lang.Closure), putAt(java.lang.String, java.lang.Object), wait() 
     at groovysh_evaluate.run (groovysh_evaluate:2) 
     ... 
groovy:000> new A().a 
===> foo 
groovy:000> new A().properties 
===> {class=class A} 
0

creo @Christoph Metzendorf respuesta era correcta ...

Con el fin de acceder a un campo directamente hay que anteponer con un signo @ :

assert "getter val" == new Foo().bar 
assert "init val" == new Foo()[email protected] 

... pero yo agregaría que en su ejemplo Foo su método getBar anuló el método getBar que Groovy generó para usted. Puede usar la sintaxis anterior para acceder directamente al bar si desea continuar anulando el método predeterminado getBar Groovy generado para usted, o simplemente no puede anular getBar para que cualquier llamada al getBar use el get Groovy generado para usted.