带有字段的Groovy扩展hashmap
这不管用。不是吗带有字段的Groovy扩展hashmap,groovy,hashmap,extend,Groovy,Hashmap,Extend,这不管用。不是吗 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 with
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
表达式
o.inner
从HashMap返回键。没有这样的键internal
,因此返回null,而在getInner()
内此字段的方法值被返回(设置为“不设置”
。这就是原因。似乎Map::get
的优先级高于object.field
或object.property
。由于类内的字段访问不经过getter,因此可以:
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
要直接访问字段,您必须使用o.@internal
,否则o.internal
将被视为获取键internal
的值,该键在这里显然是null
。当您在类中设置该属性时,setProperty()看起来仍然会被调用(例如this.internal=“newthing”)这与groovy bean不同,这正是我想要的奇怪之处/功能哇。如果您只想在属性不存在时才使用属性missing
。是的,属性missing
必须有一个存储机制(主要是一个映射)类内部,该类将隐藏字段并为字段提供访问器方法@WillP@dmahapatro对-我在看我也在想它的性能,但我会试试看。