Как я могу переопределить конструктор 'map' в классе домена Grails? - PullRequest
6 голосов
/ 13 сентября 2011

Мне нужно выполнить некоторую инициализацию, когда создаются новые экземпляры моего класса домена.

class ActivationToken {
    String foo
    String bar
}

Когда я делаю это, я хочу, чтобы панель инициализировалась кодом внутри ActivationToken:

def tok = new ActivationToken(foo:'a')

Я не вижу, как «переопределить» «конструктор», чтобы это произошло.Я знаю, что в этом случае я мог бы просто добавить нормальный конструктор, но это всего лишь простой пример.

Ответы [ 2 ]

18 голосов
/ 13 сентября 2011

Конструктор карт идет из 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()

По сути, кажется, что вам придется вручную переопределить конструкторы, если вам нужно обработать свойство после построения.

Кроме того, вы можете переопределить отдельные сеттеры, что в целом чище и безопаснее:

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()

Обратите внимание, что значение по умолчанию не обрабатывается, но в большинстве случаев это должно быть в порядке.

1 голос
/ 20 декабря 2013

Приведенное выше решение также подходит для случаев, когда инициализация объекта выполняется из параметров в веб-запросе, например, когда вы хотите игнорировать посторонние значения, перехватывая исключения отсутствующих свойств.

public Foo(Map map) {
    try {
        map?.each { k, v -> this[k] = v }
    }
    catch(Exception e){
    }
}
...