grails - 如何重写 Grails 域类中的 'map' 构造函数?

标签 grails groovy grails-orm

创建域类的新实例时,我需要执行一些初始化。

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/

相关文章:

grails - 如何在 Grails 2.4.4 的域类中使用 transient 值

gradle - 为什么Gradle不了解该文件是Groovy?

sql-server - 找不到适用于jdbc:sqlserver的驱动程序

hibernate - 在加载域之前修改gorm映射

orm - 独立使用 Grails GORM

grails - Grails日志记录在 fork 模式下不起作用

linux - 使用 Jenkins 将文件从一台 Linux 机器复制到另一台

hibernate - withTransaction 并保存大量对象?

grails - 在 Grails 中全局禁用乐观锁定

ajax - grails:具有多个选择的remoteFunction