【问题标题】:Groovy property definitionGroovy 属性定义
【发布时间】:2009-09-23 14:13:43
【问题描述】:

以前我认为 Groovy 中的属性是通过省略作用域关键字来表示的。换句话说

class Test {
   def prop = "i am a property"
   public notProp = "i am not"
}

但是,我似乎对此不正确,因为以下脚本会打印“getter val”

class Foo {
  public bar = "init val"

  public getBar() {
    "getter val"
  }
}

println new Foo().bar

在访问bar 时调用getter 的事实表明bar 是一个属性而不是一个字段。那么 Groovy 中的字段和属性到底有什么区别呢。

谢谢, 唐

【问题讨论】:

    标签: groovy


    【解决方案1】:

    为了直接访问一个字段,你必须在它前面加上一个@符号:

    assert "getter val" == new Foo().bar
    assert "init val" == new Foo().@bar
    

    new Foo().getBar() 的缩写形式有效,尽管bar 不是属性,但从我的角度来看仍然很简洁。

    相比之下,您不能调用foo.setBar("setter val"),但如果您将bar 定义为没有访问修饰符的属性,则可以。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 它们可能看起来相同,行为也基本相同,但 Groovy 只会为属性生成 getter/setter,该属性由访问修饰符的存在定义。
      【解决方案3】:

      使用修饰符确实会抑制属性的创建。让您感到困惑的是,. 似乎在不存在此类属性时回退到字段访问。

      $ groovysh Groovy Shell(2.1.0,JVM:1.7.0_21) 输入 'help' 或 '\h' 寻求帮助。 -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------- groovy:000> 类 A { def a = "foo" }; ===> 真的 常规:000> 新 A().getA() ===> 富 常规:000> 新 A().a ===> 富 groovy:000> 新的 A().properties ===> {class=A 类,a=foo}

      但是:

      groovy:000> 类 A { public def a = "foo" }; ===> 真的 常规:000> 新 A().getA() 错误 groovy.lang.MissingMethodException: 没有方法签名:A.getA() 适用于参数类型:() 值:[] 可能的解决方案:getAt(java.lang.String), grep(), grep(java.lang.Object), with(groovy.lang.Closure), putAt(java.lang.String, java.lang.Object), 等等() 在 groovysh_evaluate.run (groovysh_evaluate:2) ... 常规:000> 新 A().a ===> 富 groovy:000> 新的 A().properties ===> {class=A 类}

      【讨论】:

        【解决方案4】:

        我认为@Christoph Metzendorf 的回答是正确的......

        为了直接访问一个字段,你必须在它前面加上一个@ 签到:

        assert "getter val" == new Foo().bar
        assert "init val" == new Foo().@bar
        

        ...但我想在您的Foo 示例中添加您的getBar 方法覆盖了Groovy 为您生成的getBar 方法。如果您想继续覆盖默认的getBar Groovy 为您生成的方法,您可以使用上述语法直接访问bar,或者您不能覆盖getBar,因此任何对getBar 的调用都将使用getter Groovy为您生成。

        【讨论】:

          猜你喜欢
          • 2018-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-22
          • 1970-01-01
          • 2011-03-27
          • 2011-01-24
          相关资源
          最近更新 更多