apply
调用apply可以不使用new来创建对象。在 Scala 中,apply 方法放在类的伴生对象(object)里,主要起到 工厂方法的作用,能够让使用者在创建该类实例时省去显式的 new 关键字,并且可以通过重载提供多种构造方式。
基本案例
/**
*伴生类和伴生对象,实现一种特殊的编程模式:单例模式
*
* 在伴生对象中补充一个apply方法,这样创建对象的时候,就可以省略
* 伴生类名(参数) ===== 伴生对象名.apply(参数)
*/
//日志
class Logger (var filename:String) {
}
//2. 伴生对象中,访问private
object Logger {
def apply(filename:String):Logger={
println("apply.....")
new Logger(filename)
}
}
def main(args: Array[String]): Unit = {
//省略 new
val log1=Logger("test.log")
println(log1.filename)
}
伴生类和伴生对象 +apply 实现 单例模式
在代码中 isEmpty判断是否为空,Some()用来包装一个对象,如果这个对象为空,就得到None对象,否则就返回这个对象。
基本案例
/**
*伴生类和伴生对象 +apply 实现 单例模式
*
* 在伴生对象中补充一个apply方法,这样创建对象的时候,就可以省略 new
* 伴生类名(参数) ===== 伴生对象名.apply(参数)
*/
//.日志类
class Logger (var filename:String) {
def log(messager:String):Unit={
//把日志信息写入文件中
val writer=new FileWriter(filename,true)
writer.write(s"$messager \n")
writer.close()
}
}
object Logger {
private var instance:Option[Logger]=None
def apply(filename:String):Logger={
if(instance.isEmpty){
instance=Some(new Logger(filename))
}
instance.get
}
}
def main(args: Array[String]): Unit = {
//省略 new
val log1=Logger("test.log")
log1.log("2025-11-03 上午上课")
log1.log("2025-11-05 开运动会")
log1.log("2025-11-07 周末")
}