Scala学习之类和属性篇(五):getter和setter方法

Scala会根据你定义属性时候使用的关键字:var,val,private来选择是否自动生成gettersetter方法。而且不容许你重写Scala的settergetter方法。若是你要重写这两个方法你会看到以下编译错误: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属性,自动生成的gettersetter方法名分别是namename_=。可是你能够变通的用另外一种方式来避开Scalasettergetter方法名规范,好比咱们把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 var关键字修饰构造方法参数,通常在参数名前加上下划线“_”。
  • 定义getter和setter方法:getter方法使用“参数名”命名;setter方法使用“参数名_="来命名。

必定记住要使用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);
}
相关文章
相关标签/搜索