创建域类的新实例时,我需要执行一些初始化。
class ActivationToken {
String foo
String bar
}
当我这样做时,我希望通过 ActivationToken 内的代码初始化 bar:
def tok = new ActivationToken(foo:'a')
我不知道如何“重写”“构造函数”来实现这一点。我知道在这种情况下我可以只添加一个普通的构造函数,但这只是一个简单的示例。
最佳答案
map 构造函数来自 Groovy - 在本例中不是 Grails。我做了一些实验,这就是我想到的:
class Foo {
String name = "bob"
int num = 0
public Foo() {
this([:])
}
public Foo(Map map) {
map?.each { k, v -> this[k] = v }
name = name.toUpperCase()
}
public String toString() {
"$name=$num"
}
}
assert 'BOB=0' == new Foo().toString()
assert 'JOE=32' == new Foo(name:"joe", num: 32).toString()
基本上,如果您需要在构造后处理属性,则似乎必须手动重写构造函数。
或者,您可以覆盖各个 setter ,这通常更干净、更安全:
class Foo {
String name = "bob"
int num = 0
public void setName(n) {
name = n.toUpperCase()
}
public String toString() {
"$name=$num"
}
}
assert 'bob=0' == new Foo().toString()
assert 'JOE=32' == new Foo(name:"joe", num: 32).toString()
请注意,默认值不会被处理,但在大多数情况下应该没问题。
关于grails - 如何重写 Grails 域类中的 'map' 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7400453/