Переопределение аксессоров и мутаторов в Scala
Стандартизованный способ переопределения Аксессоров и Мутаторов по умолчанию не был исправлен в 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) // получатель
Существуют и другие подходы к именованию методов получения и установки.