Я нахожу @tim_yates ' answer приятным, но вы не можете получить доступ к delegate
возвращаемым методам значениям (что обычно нравится делать даже для Строителей в случае build()
:)
Более того, если бы это было предназначено не для Builder, а для объекта с цепочечным интерфейсом (например, для объектов с jQuery-оболочкой в JS), это было бы серьезной проблемой.поместил бы обертку так:
class FluentWrapper {
def delegate
FluentWrapper(wrapped) {
delegate = wrapped
}
def methodMissing(String name, args) {
def method = delegate.getClass().declaredMethods.find { it.name == name }
if(method) {
def result = method.invoke(delegate, args)
return result != null ? result : this
}
else throw new MissingMethodException(name, delegate, args)
}
}
Обратите внимание, что оператор elvis не подходит, поскольку ложное значение никогда не будет возвращено.
Конечно, вызывающий должен знать, является лиМетод является цепным или нет, но это может быть преодолено с помощью аннотаций метода, если это необходимо.