scala单例
object SingletonDemo {
??def main(args: Array[String]): Unit = {
????val s = SessionFactory
????println(s.getSession)
????println(s.getSession.size) ?//.size得到几个session对象
??}
}
object SessionFactory{
??println("SessionFactory 被执行了")
??
??//计数器
??var i = 5
??//存放session对象的数组
??val sessions = new ArrayBuffer[Session]()
??while(i>1){
????println("while被执行了")
????sessions.append(new Session)
????i -= 1
??}
??//获取session对象
??def getSession = sessions
}
class Session{
}
伴生对象
单例对象包括伴生对象,类与伴生对象之间可以互相访问,即使被private修饰的私有字段和属性
伴生对象首先是一个单例对象,单例对象用object定义
在scala中,单例对象分两种
1.关联并未自动关联到特定类的单例对象,称为独立对象 ->Standalone Object
2.关联到一个类的单例对象,该单例对象与该类是同一个类名,称为伴生对象 ->Companion Object
class companionObject {
??var id = 0
??private val name = "zhaoxiaodan"
??def printContent() = {
????println(name+companionObject.Constant)
??}
}
object companionObject {
??private val Constant = " is my goddess"
??def main(args: Array[String]): Unit = {
????val co = new companionObject
????co.id = 8
????println(co.id)
????println(co.name)
????co.printContent() ?//zhaoxiaodan is my goddess
??}
}
apply和unapply(通常在类的伴生对象中定义apply方法)
apply方法通常被称为注入方法,在类的伴生对象中做一个初始化操作
apply方法的参数列表不需要和主构造器列表统一
unapply方法通常为提取方法,使用unapply方法可以提取构造器中固定数量的对象和值
unapply方法会返回一个Option,如果Option里有值的话,内部会有一个some对象来封装这些值
class ApplyDemo(val name: String, val age: Int, val faceValue: Int) {
}
object ApplyDemo {
??//注入方法
??def apply(name: String, age: Int): ApplyDemo = {
????new ApplyDemo(name,age,faceValue = 80) ?//初始化
??}
??//提取方法
??def unapply(applyDemo: ApplyDemo):Option[(String,Int,Int)]={
????if (applyDemo == null){
??????None
????}else{
??????Some(applyDemo.name,applyDemo.age,applyDemo.faceValue)
????}
??}
}
object ApplyTest{
??def main(args: Array[String]): Unit = {
????val applyDemo = ApplyDemo("赵晓丹",18)
????applyDemo match {
??????case ApplyDemo("赵晓丹",age,faceValue) =>println(s"name:赵晓丹,age:$age,fv:$faceValue")
??????case _=> println("is null")
????}
??}
}
原文地址:https://blog.51cto.com/14479068/2431391