groovy中的属性看起来像没有访问修饰符的java中的类字段。真的吗?或者他们有特殊的意义。似乎没有办法让属性私有化?
答案 0 :(得分:14)
当Groovy类定义声明没有访问修饰符的字段时,会生成公共setter / getter方法对和私有实例变量字段,根据JavaBeans specification也称为“属性”。
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
将方法或实例/类变量的使用限制为托管类类型。但也许你指的是创建私有字段实例变量。
答案 1 :(得分:3)
属性通常可以像字段一样处理,但它们实际上由隐式getter / setter支持,因此您仍然可以像字段一样引用它们或将它们设置为等于值。在幕后,他们正在使用getter / setter(如果你愿意,你可以重新定义)。
此页面包含有关属性/字段和访问修饰符的详细信息(请参阅“属性和字段规则”部分):http://groovy.codehaus.org/Groovy+Beans
它还表明您可以创建一个私有属性(由私有getter / setter支持的私有字段),但您必须明确定义getter / setter。