16

groovy 中的属性看起来就像没有访问修饰符的 java 中的类字段。真的吗?或者它们有特殊的含义。似乎没有办法将属性设为私有?

4

2 回答 2

25

当 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 客户端的 pov 来看,在运行时访问 Groovy 属性和公共字段没有区别

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

虽然a.field直接访问实例变量并a.property实际调用a.getProperty()(或a.setProperty(...)在赋值时)。但是由于该属性符合 JavaBeans 规范,因此该类可以无缝地用于基于 Java 的环境中。

我认为建立“私有财产”没有多大意义。private将方法或实例/类变量的使用限制为宿主类类型。但也许您指的是创建一个私有字段实例变量。

于 2012-11-05T07:06:53.513 回答
5

属性通常可以被视为字段,但它们实际上由隐式 getter/setter 支持,因此您仍然可以像字段一样引用它们或将它们设置为等于值。在幕后,他们使用 getter/setter(如果您愿意,可以重新定义)。

此页面包含有关属性/字段和访问修饰符的详细信息(尤其参见“属性和字段规则”部分):https ://groovy-lang.org/objectorientation.html#_fields_and_properties

它还表明您可以创建私有属性(由私有 getter/setter 支持的私有字段),但您必须明确定义 getter/setter。

于 2012-11-05T04:07:28.267 回答