Если вы хотите использовать для этого черту, вам нужно сделать это иначе, чем реализовать метод 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
.