Groovy中的“properties”是什么?

18
Groovy 中的属性看起来像是 Java 中没有访问修饰符的类字段。这是真的吗?还是它们有一种特殊的含义?似乎没有办法将属性设置为私有?
2个回答

27
如果Groovy类定义声明一个没有访问修饰符的字段,则会生成一个公共setter/getter方法对和一个私有实例变量字段,这也被称为“属性”,符合JavaBeans规范
class A {
    String property

    /* 
         private String property

         public void setProperty(String property) { ... }
         public String getProperty() { ... }
    */
}

如果我们声明一个公共实例变量字段,我们只会得到一个公共字段,而没有setter/getter方法对。
class A {
    public String field

    /* 
         public String field
    */
}

从Groovy客户端的角度来看,在运行时访问Groovy属性和公共字段之间没有区别

def a = new A()
println a.field
println a.property

尽管 a.field 直接访问实例变量,而 a.property 实际上调用 a.getProperty()(或在分配值时调用 a.setProperty(...)),但由于属性符合 JavaBeans 规范,因此该类可以无缝地在基于 Java 的环境中使用。
我认为制作“私有属性”没有太多意义。 private 限制了方法或实例/类变量的使用仅限于托管类类型。但也许您是指制作私有字段实例变量。

5
属性通常可以像字段一样处理,但实际上它们是由隐式的getter/setter支持的,所以您仍然可以像处理字段一样引用它们或将其设置为值。在幕后,它们使用getter/setter(如果您愿意,可以重新定义它们)。
此页面详细介绍了属性/字段和访问修饰符(特别是“属性和字段规则”部分):https://groovy-lang.org/objectorientation.html#_fields_and_properties 它还显示您可以创建私有属性(由私有getter/setter支持的私有字段),但必须明确定义getter/setter。

此问题的编辑队列已满,但有一个更新(更为当前)的链接可用于解释属性与字段的区别,请参见:http://groovy-lang.org/objectorientation.html#_fields_and_properties - Ryan Nelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接