Переопределение аксессоров и мутаторов в Scala

Опубликовано: 2 Июля, 2021

Стандартизованный способ переопределения Аксессоров и Мутаторов по умолчанию не был исправлен в Scala, но пользователи этого языка программирования используют один конкретный и общий метод переопределения, который подробно обсуждается ниже.

Прежде чем мы начнем, что такое Аксессоры и Мутаторы?
Аксессоры и мутаторы просто можно назвать методами получения и установки соответственно. Аксессоры используются для доступа к данным с помощью переменных или констант, помогая пользователю извлекать информацию, работая аналогично методу Get в Java и мутаторах, что означает изменение, при котором переменные изменяются вызовом функции и назначаются новое значение, они работают аналогично методу Set в Java.

Рассмотрим следующий код Java, использующий методы set и get для класса Employee:




public class Employee {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
}

Если вы попытаетесь написать код для класса с именем Employee с параметром конструктора с именем name и попытаетесь создать методы получения и установки в соответствии с соглашениями Scala, ваш код не будет компилироваться.

// ошибка: это не сработает
class Employee (частное имя переменной: String) {
  def name = имя
  def name _ = (aName: String) {name = aName}
}

При компиляции этого кода возникают следующие ошибки:

Person.scala:3: error: overloaded method name needs result type
def name = name
^
Person.scala:4: error: ambiguous reference to overloaded definition,
both method name_= in class Employee of type (aName: String)Unit
and method name_= in class Employee of type (x$1: String)Unit
match argument types (String)
def name_=(aName: String) { name = aName }
^
Person.scala:4: error: method name_= is defined twice
def name_=(aName: String) { name = aName }
^
three errors found

Компилятор Scala жалуется на конфликт имен между полем «name» и методом «name». Простой способ решить эту ошибку - добавить подчеркивание к переменной поля. Это устраняет двусмысленность.

Примечание: подчеркивание используется в позиции префикса, а не в позиции суффикса, чтобы избежать опасности ошибочного ввода «name _» вместо «name_». Ошибка при вводе наоборот может потенциально привести к очень запутанной ошибке из-за интенсивного использования вывода типов в Scala.

class Employee (private var _name: String) {
  def name = _name // аксессор
  def name _ = (aName: String) {_name = aName} // мутатор
} 

Как вызвать методы конструктора:

val e = новый сотрудник ("Аделиция")
e.name = "Alice" // установщик
println (e.name) // получатель

Существуют и другие подходы к именованию методов получения и установки.