Scala 尚未修复覆盖默认访问器和修改器的标准化方法,但这种编程语言的用户使用一种特定且通用的覆盖方法,下面将详细讨论。
在我们开始之前,什么是访问器和修改器?
Accessors 和 Mutator 可以简单地分别称为 get 和 set 方法。访问器用于通过使用变量或常量来访问数据,帮助用户检索信息,其工作类似于Java和 Mutators 中的“Get”方法,意思是更改,其中变量通过调用函数更改并分配一个新值,它们的工作方式类似于Java的“Set”方法。
考虑以下使用 set 和 get 方法对类 Employee 的Java代码:
public class Employee {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
如果您尝试使用名为 ‘name’ 的构造函数参数为名为 Employee 的类编写代码并尝试创建 get 和 set 方法,则根据 Scala 约定,您的代码将无法编译。
// error: this won't work
class Employee(private var name: String) {
def name = 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 // accessor
def name_=(aName: String) { _name = aName } // mutator
}
构造方法的调用方法如下:
val e = new Employee("Adelicia")
e.name = "Alice" // setter
println(e.name) // getter
还有其他方法可以命名 getter 和 setter 方法。