Я задаю несколько иной вопрос, чем this one. Предположим, у меня есть фрагмент кода:Плюсы и минусы выбора def over val
def foo(i : Int) : List[String] = {
val s = i.toString + "!" //using val
s :: Nil
}
Это функционально эквивалентно следующему:
def foo(i : Int) : List[String] = {
def s = i.toString + "!" //using def
s :: Nil
}
Почему я выбираю один над другим? Очевидно, я предполагаю, что второй имеет незначительные недостатки в:
- создавая больше байткод (внутренняя
def
поднимается к методу в классе) - производительность выполнения накладные расходы вызова метода через доступ к значению
- нестрогие оценка означает, что я мог бы легко получить доступ к
s
дважды (т.е. unnecesasarily повторить расчет)
Единственное преимущество я могу думать:
- нестрогие оценка
s
означает, что она вызывается только тогда, когда оно используется (но тогда я мог бы просто использоватьlazy val
)
Какие мысли народов здесь? Есть ли существенная диспропорция для меня, делая все внутреннее val
s def
s?
Но если используется только один раз, когда 'lazy val' будет медленнее, чем' def'. – Debilski
Это правда, но я ожидаю, что чрезмерное использование 'def's вызовет массивный * класс bloat –
Но опять же, это в равной степени верно и для' lazy val's. Таким образом, преимущество все еще сохраняется. – Debilski