Exensión del Operador de Acceso a un Atributo (dot)

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

Intercepción de Atributos Existentes

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$



Subsecciones
Casiano Rodríguez León
2010-04-30