Плюсы и минусы выбора def вместо 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 дважды (т.е. без необходимости повторять вычисление)

Единственное преимущество , о котором я могу думать, это:

  • нестрогая оценка s означает, что он вызывается только в том случае, если он используется (но тогда я мог бы просто использовать lazy val )

Что такое люди? мысли здесь? Есть ли у меня значительный недостаток в создании всех внутренних val s def s?

11
задан Community 23 May 2017 в 10:26
поделиться