当支持字段为 public 时自动生成 getter 和 setter 的目的是什么
What is the purpose of automatically generating getters and setters when the backing field is public
来自 Groovy documentation 的属性部分:
class Person {
String name
int age
}
You can define a property with:
an absent access modifier (no public, protected or private)
...
Groovy will then generate the getters/setters appropriately
所以使用上面的代码片段,我可以这样做:
Person sveta = new Person("Sveta",22)
println(sveta.getname())
println(sveta.name)
问题:你为什么要这样做?
声明一个没有访问修饰符的变量并允许在我仍然可以直接访问该字段时自动为您生成 getter/setters
并绕过 setter 的目的是什么?
我 不是 问 setter 的目的是什么,或者我为什么要使用它,我想问的是 Groovy 在某些情况下会为您生成 getter/setter
,但在生产中您什么时候想这样做?
对我来说,当您需要 Java 样式的 bean 对象(例如传递给库或框架)时,它只是一种方便,带有 getters 和 setters 而不必键入和维护所有 getter 和 setter 代码/样板。此外,当您像示例中那样直接访问该字段时,它仍在调用 getter 和 setter,因此 Groovy 中的 getters 和 setters可以提供即使在使用直接字段访问时也会调用的自定义函数或副作用(可能不受欢迎)。像这样:
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 文档中更清楚地解释为什么会这样。
来自 Groovy documentation 的属性部分:
class Person {
String name
int age
}
You can define a property with:
an absent access modifier (no public, protected or private)
...
Groovy will then generate the getters/setters appropriately
所以使用上面的代码片段,我可以这样做:
Person sveta = new Person("Sveta",22)
println(sveta.getname())
println(sveta.name)
问题:你为什么要这样做?
声明一个没有访问修饰符的变量并允许在我仍然可以直接访问该字段时自动为您生成 getter/setters
并绕过 setter 的目的是什么?
我 不是 问 setter 的目的是什么,或者我为什么要使用它,我想问的是 Groovy 在某些情况下会为您生成 getter/setter
,但在生产中您什么时候想这样做?
对我来说,当您需要 Java 样式的 bean 对象(例如传递给库或框架)时,它只是一种方便,带有 getters 和 setters 而不必键入和维护所有 getter 和 setter 代码/样板。此外,当您像示例中那样直接访问该字段时,它仍在调用 getter 和 setter,因此 Groovy 中的 getters 和 setters可以提供即使在使用直接字段访问时也会调用的自定义函数或副作用(可能不受欢迎)。像这样:
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 文档中更清楚地解释为什么会这样。