Давайте рассмотрим простой Groovy DSLИспользуйте 'владелец' в Groovy DSL
execute {
sendNotification owner
sendNotification payee
}
Реализация выполнения является
public static void execute(Closure dslCode) {
Closure clonedCode = dslCode.clone()
def dslDelegate = new MyDslDelegate(owner: 'IncCorp', payee: 'TheBoss')
clonedCode.delegate = dslDelegate
clonedCode.call()
}
и пользовательский делегат
public static class MyDslDelegate {
def owner
def payee
void sendNotification(to) {
println "Notification sent to $to"
}
}
Ожидаемый результат от эксплуатации execute
Блок:
Notification sent to IncCorp
Notification sent to TheBoss
фактического один
Notification sent to class package.OwnerClassName
Notification sent to TheBoss
Проблема заключается в том owner
является зарезервированным свойством в Groovy Closure
сами и не resolveStrategy
вариантов не помогают заменить owner
значения с таможенной стоимостью от делегата благодаря Groovy getProperty
реализации для Closure
public Object getProperty(final String property) {
if ("delegate".equals(property)) {
return getDelegate();
} else if ("owner".equals(property)) {
return getOwner();
...
} else {
switch(resolveStrategy) {
case DELEGATE_FIRST:
...
}
Мой вопрос заключается в том, как кто-нибудь может исход это ограничение и использовать owner
в пользовательском DSL?