关于case class


将类定义为case类会生成许多模板代码:

  • apply方法,可以省去new 关键字创建新实例
  • case class的构造函数参数默认是val,会自动生成访问方法,var会自动生成修改方法
  • 会生成一个默认toString方法
  • 会生成equals和hashCode方法
  • 一个copy方法

当然我们也可以使用 override 重写方法

首先,介绍一下scala类的主构造函数:

  • 构造函数参数
  • 类内部被调的方法
  • 类内部被执行的语句和表达式
    然后就是构造函数字段的可见性:
  • 字段被声明为var,scala会自动生成getter和setter方法
  • 如果被声明为val,会自动生成getter方法
  • 如果没有var或val的修饰符,会保守不生成getter和setter方法
  • var和val可以被private关键字修饰,可以防止生成getter和setter

如果想要覆写scala自动生成的getter和setter方法。

//error: this won't  work
class People(val name: String) {
  def name = name

  def name_ = (aName: String) {
    name = aName
  }
}

这个是无法编译通过的,可以尝试下的方法

class People(var _name: String) {
  def name = _name

  def name_= (s: String){
    this._name = s
    print(s"$name")
  }
}

val p = new People("jude")
println(p.name)
p.name = "bitch"

res:
jude
bitch

说明这里参考scala编程实战使用this.name_=s会报java.lang.StackOverflowError,scala 版本为2.13.2,修改为this._name

emmm,有点偏离最初的想法了,最开始只是想在不用case class的情况下,只使用class实现一下case class的getter和setter方法。虽然很简单,但是还是贴一下代码吧。

class People(val name: String, val age: Int){
    def apply(name: String, age: Int): People = new People(name, age)
    override def toString  = s"$name is $age years old"
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM