带有字段的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对-我在看我也在想它的性能,但我会试试看。