Ответ 1
Преимущество неизменяемых структур данных, в данном случае Set, заключается в том, что они являются постоянными. Например:
var jetSet1 = Set("Boeing", "Airbus")
val jetSet2 = jetSet1 // ... imagine jetSet2 is somewhere else in the program
jetSet1 += "Lear"
assert(!jetSet2.contains("Lear"))
Неизменяемость этих объектов Set упрощает рассуждение о программе, поскольку обновления переменной jetSet1
не имеют побочных эффектов в других частях кода (в этом случае везде, где используется jetSet2
). Хотя из этого примера неясно, бывают случаи, когда удобно хранить неизменяемые значения в изменяемых ссылках var
; чаще всего var
будет иметь ограниченную область действия (например, локально для функции).
Неизменяемые структуры данных часто имеют умные реализации, которые являются достаточно эффективными. К сожалению, API-интерфейс Scala API недостаточно хорошо документирован в отношении производительности, но я ожидаю, что большинство операций будут примерно равны O (log N). Например, учитывая большой неизменяемый Set s
, нужно иметь возможность эффективно построить s + x
новый набор с дополнительным элементом. Разумеется, неизменность гарантирует, что s
также сохраняется. Под капотом s
и s+x
будут храниться с использованием каких-то древовидных структур данных с общими компонентами.
В заголовке вашего вопроса вы также найдете советы по использованию val
или var
. Эмпирическое правило - использовать val
всякий раз, когда вы можете удобно. Если требуется var
, попробуйте как можно больше ограничить область переменных.