groovy 中的属性看起来就像没有访问修饰符的 java 中的类字段。真的吗?或者它们有特殊的含义。似乎没有办法将属性设为私有?
2 回答
当 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
将方法或实例/类变量的使用限制为宿主类类型。但也许您指的是创建一个私有字段实例变量。
属性通常可以被视为字段,但它们实际上由隐式 getter/setter 支持,因此您仍然可以像字段一样引用它们或将它们设置为等于值。在幕后,他们使用 getter/setter(如果您愿意,可以重新定义)。
此页面包含有关属性/字段和访问修饰符的详细信息(尤其参见“属性和字段规则”部分):https ://groovy-lang.org/objectorientation.html#_fields_and_properties
它还表明您可以创建私有属性(由私有 getter/setter 支持的私有字段),但您必须明确定义 getter/setter。