Para extender el operador dot (punto) a atributos de manera que pueda aplicarse
a cualesquiera cadenas,
se deben proveer métodos con nombres
get
y set
con la siguiente firma (signature):
Object get(String name) void set(String name, Object value)estos métodos no efectan a los atributos existentes.
En este ejemplo usamos esta técnica para acceder a las claves de un mapa del objeto como si fueran atributos:
generaciondecodigos@nereida:~/Lgroovy/objects$ cat -n overloadDot.groovy 1 class PretendFieldCounter { 2 public count = 10 3 4 def attr = [:] 5 6 Object get(String name) { 7 attr[name] 8 } 9 10 void set(String name, Object value) { 11 attr[name] = value 12 } 13 } 14 15 def p = new PretendFieldCounter() 16 17 p.length = 3.5 18 p.color = 'blue' 19 println "p.color = ${p.color}" 20 println "p.length = ${p.length}" 21 println "p.count = ${p.count}"
Véase la salida:
generaciondecodigos@nereida:~/Lgroovy/objects$ groovy overloadDot.groovy p.color = blue p.length = 3.5 p.count = 10
Si queremos interceptar los accesos a un atributo definido attribute
deberemos escribir
métodos getAttribute
y setAttribute
. Véase la siguiente
variante del ejemplo anterior:
~/Lgroovy/objects$ cat -n overloadDot2.groovy 1 class PretendFieldCounter { 2 def count = 10 3 4 def attr = [:] 5 Object get(String name) { 6 attr[name] 7 } 8 void set(String name, Object value) { 9 attr[name] = value 10 } 11 12 Object getCount() { 13 2*count+10 14 } 15 16 } 17 18 def p = new PretendFieldCounter() 19 20 p.length = 3.5 21 p.color = 'blue' 22 p.'strange name' = 8 23 println "p.color = ${p.color}" 24 println "p.length = ${p.length}" 25 println "p.strange name = ${p.'strange name'}" 26 println "p.count = ${p.count}"
Al ejecutar este programa obtenemos la siguiente salida:
~/Lgroovy/objects$ groovy overloadDot2.groovy p.color = blue p.length = 3.5 p.strange name = 8 p.count = 30 ~/Lgroovy/objects$