在公开字段中自动生成getter和setter的目的是什么

时间:2018-09-16 16:47:15

标签: oop groovy getter-setter

从Groovy documentation的属性部分:

class Person {
    String name                             
    int age                                 
}
  

您可以使用以下方法定义属性:

     

缺少访问修饰符(无公共,受保护或私有)

     

...

     

然后,Groovy将适当地生成吸气剂/吸气剂

因此,使用上面的代码段,我可以做到这一点:

Person sveta = new Person("Sveta",22)
println(sveta.getname())
println(sveta.name)

问题:您为什么要这样做?

声明一个没有访问修饰符的变量的目的是什么,而当我仍然可以直接访问该字段并绕开设置程序时,允许自动为您生成getter/setters的目的是什么?

问一个setter的目的是什么,或者为什么我要使用一个setter,我要问的是,Groovy在一定条件下为您生成了getter/setter情况下,但是在生产中您什么时候想要这样做?

1 个答案:

答案 0 :(得分:1)

对我来说,这是一种方便,当您需要具有带有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文档中更清楚地解释其原因。