Во-первых, поддержание открытого поля позволяет клиенту читать и писать поле.Поскольку иметь неизменяемые объекты выгодно, я бы рекомендовал сделать поле доступным только для чтения (чего можно добиться в Scala, объявив его как «val», а не «var»).
Теперь вернемся к вашему фактическомувопрос.Scala позволяет вам определять свои собственные сеттеры и геттеры, если вам нужно больше, чем тривиальные версии.Это полезно для поддержки инвариантов.Для сеттеров вы можете проверить значение поля.Если вы оставите само поле открытым, у вас нет шансов сделать это.
Это также полезно для полей, объявленных как "val".Предположим, у вас есть поле типа Array [X] для представления внутреннего состояния вашего класса.Теперь клиент может получить ссылку на этот массив и изменить его - опять же у вас нет шансов обеспечить сохранение инварианта.Но так как вы можете определить свой собственный метод получения, вы можете вернуть копию фактического массива.
Тот же аргумент применяется, когда вы создаете поле ссылочного типа "final public" в Java - клиенты не могут сбросить ссылку, но все же изменяют объект, на который указывает ссылка.
Примечание: доступ к полю через геттеры в Scala выглядит как прямой доступ к полю.Приятно то, что это позволяет сделать доступ к полю и вызов метода без параметров объекта похожим на одно и то же.Поэтому, если вы решили, что больше не хотите хранить значение в поле, а рассчитываете его на лету, клиенту не нужно заботиться, потому что для него это похоже на одно и то же - это называется Принцип единого доступа