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

Scala会根据你定义属性时候使用的关键字:var,val,private来选择是否自动生成gettersetter方法。并且不允许你重写Scala的settergetter方法。如果你要重写这两个方法你会看到如下编译错误:

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_=,你只要不用这两个方法名就可以了。

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属性值。

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的规范。

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方法,我们需要注意下面几点。

  • 使用private var关键字修饰构造方法参数,一般在参数名前加上下划线“_”。
  • 定义getter和setter方法:getter方法使用“参数名”命名;setter方法使用“参数名_="来命名。

一定记住要使用private关键字来修饰构造方法参数,否则Scala会生成一对默认的getter和setter方法。

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方法。

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文件。

public class Stock extends java.lang.Object{
  public java.lang.String symbol();
  public void symbol_$eq(java.lang.String);
  public Stock(java.lang.String);
}

 

转载于:https://my.oschina.net/nenusoul/blog/803653

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值