Я не знаю ни одного прямого способа запоминания методов, как вы можете запоминать Закрытие.
Если метод не получает никаких параметров (и, следовательно, возвращаемое значение всегда одинаково, поскольку оно является чистым), вы можете сделать запоминание, просто сохранив возвращаемое значение в атрибуте члена. Этот метод очень распространен в Ruby и обычно принимает форму def some_method; @value ||= compute_value; end
. Переводя это в Groovy, вы можете сделать что-то вроде:
class Computer {
private answer
def getAnswer() {
answer = answer ?: computeAnswer()
}
private computeAnswer() {
println "Computing the Answer to the Ultimate Question of Life, the Universe, and Everything"
42
}
}
def c = new Computer()
println c.answer
println c.answer
Вывод:
Computing the Answer to the Ultimate Question of Life, the Universe, and Everything
42
42
Так что памятка сработала:)
Если вы не хотите определять дополнительный метод, вы также можете написать метод getAnswer
, например:
def getAnswer() {
if (answer != null) return answer
println "Computing the Answer to the Ultimate Question of Life, the Universe, and Everything"
answer = 42
}
Теперь, если метод действительно получает какие-либо параметры, было бы весьма неудобно осуществлять запоминание таким способом. Вместо этого вы можете вызвать запомненное закрытие из того метода, который вы хотите запоминать:
class Calculator {
def sum(a, b) {
memoizedSum(a, b)
}
private memoizedSum = { a, b ->
println "Computing the sum of $a and $b"
a + b
}.memoize()
}
def c = new Calculator()
println c.sum(4, 7)
println c.sum(4, 7)
println c.sum(4, 2)
Вывод:
Computing the sum of 4 and 7
11
11
Computing the sum of 4 and 2
6