将类定义为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"
}