【问题标题】:Groovy extended hashmap with a field带有字段的 Groovy 扩展哈希图
【发布时间】:2014-05-23 05:14:22
【问题描述】:

这不起作用。不应该吗?

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 否则o.inner 将被视为获取键inner 的值,此处显然是null

标签: groovy hashmap extend


【解决方案1】:

似乎Map::get 的优先级高于object.fieldobject.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

【讨论】:

  • setProperty() 看起来当您在类中设置该属性(例如 this.inner = “newthing”)时它仍然会被调用,这与 groovy bean 不同,而这正是我的怪异/功能正在寻找
  • 哇。还有propertyMissing,如果你只想要属性不存在的话。
  • 是的,propertyMissing 必须在类内部有一个存储机制(主要是映射),它将保护字段并为字段提供访问器方法。 @WillP
  • @dmahapatro 对 - 我在看 stackoverflow.com/questions/6740702/… 我也想知道它的性能,但我会试试看。
【解决方案2】:

表达式 o.inner 从 HashMap 返回键。没有这样的键inner 所以返回null,而在getInner() 方法内部返回this.inner 字段的值(设置为"set without"。这就是原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2011-06-14
    • 2019-08-15
    • 1970-01-01
    • 2020-03-23
    • 2015-12-21
    相关资源
    最近更新 更多