1.Apply方法
Scala中实例化一个类,可以不用new , 其原因 其实就是 apply 方法
apply方法的调用约定:
用括号传递给类实例或者单例对象名一个或者多个对象的时候
scala会在对应的类或者对象中查找apply方法
且参数列表和传入的参数一致的方法
并用传入的参数来调用apply方法
在scala创建对象一般可以通过使用构造器或者调用自己的方法
object Test_Apply{
def main(args: Array[String]): Unit = {
//创建对象的方法
//1.通过构造器创建对象
val person1 = new Person10
//2.通过静态方法
val person2 = Person10.getObject()
}
}
class Person10
{
}
object Person10
{
def main(args: Array[String]): Unit = {
}
def getObject():Person10=new Person10
}
也可以使用apply方法来创建对象,因为apply方法非常的特殊,可以不写方法名称来调用,通过括号来调用
//3.通过apply方法
val person3:Person10= Person10()
object Person10
{
def apply():Person10={
new Person10()
}
}
apply方法可以任意自定义,不一定非要用于函数的创建
object Person10
{
def apply():Unit={
println("hello world")
}
}
object Test_Apply{
def main(args: Array[String]): Unit = {
Person10()
}
}
2.单例模式
单例模式分为懒汉式和饿汉式
a.懒汉式
默认不会实例化,什么时候用什么时候new。
懒汉式占用内存小,线程不安全(两个线程同时为这个对象赋值),可以通过加锁来解决这个问题
//1.懒汉式
//先将构造器私有化
class Student10 private(){
}
object Student10{
private var student10:Student10=null;
def apply():Student10={
if(student10==null)
{
//说明是第一次调用
student10=new Student10()
student10
}else
{
student10
}
}
}
b.饿汉式
类加载的时候就实例化,并且创建单例对象。
饿汉式:没有线程安全的问题,写起来相对简单,占用内存相对较多
class Student10 private(){
}
object Student10{
println val student10:Student10=new Student10()
def apply():Student10=student10
}