如果我有这样的课程:
class Person {
def name
def greeting = "hello $name"
}
我打电话 bob = new Person(姓名:“bob”)
当我在这一点上检查鲍勃时,我发现问候语中没有'bob'。我做错了什么?
答案 0 :(得分:11)
您可以use the @Lazy
annotation解决此问题
class Person {
def name
@Lazy def greeting = "hello $name"
}
bob = new Person(name: "bob")
println bob.greeting
将根据您的需要打印hello bob
。注释会更改问候语的getter,以便仅在第一次调用时生成(然后缓存结果)。一旦调用greeting
会产生name
静态,这会产生副作用,但是你不会说它是否需要随着时间的推移而改变(由于bob = new Person(name: "bob")
println bob.greeting
bob.name = 'dave'
println bob.greeting
改变)...即; < / p>
hello bob
hello bob
将打印:
{{1}}
答案 1 :(得分:2)
我会像这样实现它
class Person {
def name
String getGreeting() {"hello $name"}
}
这样问候语仍然是属性,您可以像
一样引用它def bob = new Person(name: 'Bob')
println bob.greeting
答案 2 :(得分:1)
构造函数调用发生在对象的init之后。换句话说,在调用构造函数之前设置了greeting值。
如果你想做你正在做的事情,你需要一个构造函数,它将名称作为参数并将问候语分配给“你好:$ {name}”
P.S。我不太确定参数赋值(名称:“bob”)是否在构造函数之后或之内发生,其他人可能会回答这个问题。
答案 3 :(得分:0)
你能为#name添加一个setter吗?如果你定义了一个Groovy会调用它。
class Person {
def name
def greeting = "hello"
void setName(final val) { name = val; greeting = "hello $name" }
}
final o = new Person(name:"bob")
assert o.greeting == "hello bob"