Groovy:构造函数问题

时间:2011-07-18 07:02:21

标签: groovy

如果我有这样的课程:

class Person { 
def name
def greeting = "hello $name"
}

我打电话 bob = new Person(姓名:“bob”)

当我在这一点上检查鲍勃时,我发现问候语中没有'bob'。我做错了什么?

4 个答案:

答案 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"