Scala会根据你定义属性时候使用的关键字:var,val,private来选择是否自动生成getter和setter方法。而且不容许你重写Scala的setter和getter方法。若是你要重写这两个方法你会看到以下编译错误:java
scala> :paste // Entering paste mode (ctrl-D to finish) class Person(private var name: String) { def name = name def name_=(aName: String) {name = aName} } // Exiting paste mode, now interpreting. <console>:12: error: overloaded method name needs result type def name = name ^ <console>:13: error: method name_= is defined twice conflicting symbols both originated in file '<console>' def name_=(aName: String) {name = aName} ^
Scala默认对于Person类的name属性,自动生成的getter和setter方法名分别是name和name_=。可是你能够变通的用另外一种方式来避开Scala的setter和getter方法名规范,好比咱们把name属性名改成_name那么这个时候Scala默认生成的getter和setter方法是_name和_name_=,你只要不用这两个方法名就能够了。ide
scala> :paste // Entering paste mode (ctrl-D to finish) class Person(private var _name: String) { def name = _name def name_=(aName: String) {_name = aName} override def toString = s"name is $name" } // Exiting paste mode, now interpreting. defined class Person scala> val p = new Person("Li Ming") p: Person = name is Li Ming
由于name属性是private var修饰的,因此它是可变,再加上咱们定义了本身的getter方法。咱们能够改变并获取name属性值。this
scala> val p = new Person("Li Ming") p: Person = name is Li Ming scala> p.name = "Wang Wei" p.name: String = Wang Wei scala> p.name res2: String = Wang Wei
咱们来看一下反编译后的class文件中的getter和setter方法,你会看到一个getter方法:symbol();一个setter方法symbol_$eq。这就是Scala生成getter和setter的规范。scala
class Stock (var symbol: String) public class Stock extends java.lang.Object{ public java.lang.String symbol(); public void symbol_$eq(java.lang.String); public Stock(java.lang.String); }
总结一下:重定义Scala默认生成的getter和setter方法,咱们须要注意下面几点。code
必定记住要使用private关键字来修饰构造方法参数,不然Scala会生成一对默认的getter和setter方法。get
scala> :paste // Entering paste mode (ctrl-D to finish) class Stock (var _symbol: String) { def symbol = _symbol def symbol_=(s: String) { this._symbol = s println(s"symbol was updated, new value is $symbol") } } // Exiting paste mode, now interpreting. defined class Stock
反编译生成的class文件,你会发现除了你本身定义的getter和setter方法外,Scala还为你生成了一对默认的getter和setter方法。it
public class Stock extends java.lang.Object{ //Scala自动生成的getter和setter方法 public java.lang.String _symbol(); public void _symbol_$eq(java.lang.String); //自定义的getter和setter方法 public java.lang.String symbol(); public void symbol_$eq(java.lang.String); public Stock(java.lang.String); }
使用private关键修饰后,反编译生成的class文件。console
public class Stock extends java.lang.Object{ public java.lang.String symbol(); public void symbol_$eq(java.lang.String); public Stock(java.lang.String); }