从Groovy documentation的属性部分
class Person {
String name
int age
}
您可以使用以下命令定义属性:
缺少访问修饰符(无public、protected或private)
..。
Groovy随后将相应地生成getter/setter
因此,使用上面的代码片段,我可以这样做:
Person sveta = new Person("Sveta",22)
println(sveta.getname())
println(sveta.name)
问题:,你为什么要这样做?
声明一个没有访问修饰符的变量,并允许自动为您生成getter/setters
,而我仍然可以直接访问该字段,并绕过setter,这是什么目的?
我不是,而不是,我问的是setter的用途是什么,或者我为什么要使用setter,我问的是,在某些情况下,Groovy会为你生成getter/setter
,但在生产中,你什么时候想这样做?
发布于 2018-09-17 01:51:55
对我来说,当您需要一个带有getter和setter的Java样式bean对象(例如,传递到一个库或框架),而不必键入和维护所有的getter和setter代码/样板时,这只是一种便利。此外,当您像在示例中那样直接访问字段时,它仍然调用getter和setter,因此Groovy中的getter和setter可以提供自定义函数或副作用(可能并不理想),即使使用直接字段访问也会调用这些函数或副作用。如下所示:
import groovy.transform.ToString
@ToString
class Person {
String name
int age
String getName() {
if(name == 'fred') {
return 'fred bloggs'
}
else {
return name
}
}
}
def p = new Person()
p.name = 'fred'
assert p.name == 'fred bloggs'
assert p.getName() == 'fred bloggs'
println p.toString()
p.name = 'sally'
assert p.name == 'sally'
assert p.getName() == 'sally'
println p.toString()
输出结果如下:
Person(fred bloggs, 0)
Person(sally, 0)
但是您是对的,我认为为什么需要在Groovy文档中更清楚地解释。
https://stackoverflow.com/questions/52356303
复制相似问题