Давайте на минутку представим, что было возможно переопределить сгенерированный метод доступа:
class MyExample(var attribute : String)
{
def attribute() = attribute + "abc" // won't compile!
}
Без дальнейшей квалификации невозможно определить, находится ли имя attribute
в теле методаотносится к полю класса или рекурсивно к самому методу.
По замыслу в Scala методы и поля принадлежат одному и тому же пространству имен, это, известное как Принцип унифицированного доступа , даетвозможность изменения внутренней реализации без нарушения внешнего интерфейса.
Первоначальная реализация может быть:
class MyExample(val attribute : String)
Затем изменена на:
class MyExample (attr :String) {
def attribute = attr toUpperCase
}
И затем
class MyExample(var attribute : String)
Или
class MyExample(attr : String) {
def attribute = attr toUpperCase
def attribute_= (a : String) { attr = a + "abc" }
}
Все без нарушения какого-либо зависимого кода.
Когда поле определено как часть конструктора, автоматически генерируемые методы доступа являются синтаксическим сахаром,Сахар облегчает быстрое создание прототипов и помогает сделать код кратким.Тем не менее, всякий раз, когда вы хотите добавить больше вещества, вы должны использовать полный синтаксис.