groovy hashmap extend

Groovy extended hashmap con un campo



groovy map collect (2)

Esto no funciona ¿No debería?

class WeirdBean extends HashMap { public String inner = "set within" def getInner() { return this.inner } def getOuter() { return this.outer } } def o = WeirdBean.newInstance() o.outer = "set without" println o.getOuter() // set without println o.outer // set without assert o.outer == o.getOuter() // Pass println o.getInner() // set within println o.inner // null, even though public assert o.inner == o.getInner() // Fail, o.inner is null


Expression o.inner devuelve la clave de HashMap. No existe tal clave inner por lo que se devuelve null, mientras que se getInner() valor del método getInner() interior de this.inner campo this.inner (que está configurado en "set without" . Por eso.


Parece que Map::get tiene mayor prioridad que object.field u object.field . Como un acceso de campo dentro de una clase no pasa por el getter, esto funciona:

class WeirdBean extends HashMap { public String inner = "set within" def getInner() { return this.inner } def getProperty(String property) { (property == ''inner'') ? inner : super.get(property) } def getOuter() { return this.outer } } def o = WeirdBean.newInstance() o.outer = "set without" println o.getOuter() // set without println o.outer // set without assert o.outer == o.getOuter() // Pass println o.getInner() // set within println o.inner // null, even though public assert o.inner == o.getInner() // Fail, o.inner is null