Apply方法
apply 方法放在类的伴生对象(object)里,主要起到 工厂方法的作用,能够让使用者在创建该类实例时省去显式的 new 关键字,并且可以通过重载提供多种构造方式。
apply写在伴生对象中,它返回类的实例- 实例化对象时,就可以不用写
new
apply实现单例模式
示例代码:
package Luwenzhen
object class05 {
/*
apply
apply方法写在伴生对象中,可以在创建对象的时候,省略new关键字
实现单例模式
在伴生对象中,创建一个对象,在apply方法中返回它
*/
class Person() {
println("主构造器被调用。。。")
}
object Person {
val p=new Person()
def apply():Person={
p
}
}
def main(args: Array[String]): Unit = {
//创建一个类的对象
//val p1=new Person()
val p1=Person()//自动调用apply方法
val p2=Person()
println(p1)
println(p2)
println(p1==p2)//true
}
}
运行结果:
主构造器被调用。。。
Luwenzhen.class05$Person@27f674d
Luwenzhen.class05$Person@27f674d
true
案例-日志类
Option[Logger]表示一种特殊的数据类型:可能是None,可能是Loggerinstance.isEmpty判断是否为空。
package Luwenzhen
import java.io.FileWriter
object class06 {
/*
实现一个日志类:Logger
1.把一些操作信息写入到文本文件中
2.实现单例模式
*/
class Logger(filename:String) {
def log(content:String):Unit={
//把内容写入一个文件中
val writer=new FileWriter(filename,true)
writer.write(content+"\n")
writer.close()
// println(s"${content}")
}
}
object Logger {
//定一个对象
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 = {
val logger1= Logger("test.log")
//val logger2= Logger("test.log")
//logger2.log("2005-11-5 09:06:03 不上课")
logger1.log("2005-11-4 09:06:03 上课")
logger1.log("2005-11-5 09:30:03 不上课")
logger1.log("2005-11-6 09:45:03 运动会")
}
}
运行后会得到一个test.log 的文件