Можно ли прослушивать изменения свойств суперкласса в Groovy? - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел бы создать сеттер «перезагрузки» для свойства, которое я хотел бы оставить в черте.Тогда любые подклассы, которые реализуют черту, будут использовать свой собственный получатель, но установщик признака.Я не хочу добавлять какие-либо дополнительные аннотации к существующим свойствам.Вот пояснение:

trait Tr {
    abstract String getS()
    void setS(String value) {
        ((GroovyObject) this).setProperty('s', value)
        reloadOnSChange()
    }

    void reloadOnSChange() {
        // do something when S is changed
    }
}

class Cl implements Tr {
    String s
}

Cl cl = new Cl()
cl.s = 'hello world' // reloadOnSChange should be called

Возможно ли прослушивание такого свойства?

1 Ответ

0 голосов
/ 21 сентября 2018

Если вы хотите использовать для этого черту, вам нужно сделать это иначе, чем реализовать метод void getS(String value), потому что Groovy-компилятор генерирует метод Cl.getS(String value), который скрывает метод, реализованный в черте Tr.* В качестве альтернативы ваша черта может обеспечить реализацию метода void setProperty(String name, Object value), который при вызове свойства s выполняет метод reloadOnSChange().Рассмотрим следующий пример:

trait Tr {
    abstract String getS()
    abstract void setS(String s)

    void reloadOnSChange() {
        // do something when S is changed
        println "RELOAD"
    }

    void setProperty(String name, Object value) {
        metaClass.setProperty(this, name, value)
        if (name == 's') {
            reloadOnSChange()
        }
    }
}

class Cl implements Tr {
    String s
}

Cl cl = new Cl()
cl.s = 'hello world'

println "Dump: ${cl.dump()}"

Вывод:

RELOAD
Dump: <Cl@6580cfdd s=hello world>

Основным недостатком является то, что этот метод setProperty будет выполняться для каждого свойства, поэтому он может генерировать некоторые издержки.В какой-то момент JIT должен оптимизировать код и убедиться, что этот оператор if выполняется только тогда, когда имя свойства равно s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...