在Scala语法中,并没有静态成员,所以并不能像Java一样构建单例。但是他拥有伴生对象的特性,所以可以利用这一点来达到同样的目的。
伴生对象类型为object,名称和class保持一致,那么这个object就是此class的伴生对象。class和object之间可以互相访问各自的成员变量,且object内的成员变量都是静态的。下面贴一下代码,具体如何实现。
class Student private(var name: String) {
var age: Int = _
var clazz: String = Student.clazz
private def this(name: String, age: Int) {
this(name)
this.age = age
}
override def toString: String = "My name is " + name + " and age is " + age + ". I am from " + clazz
}
object Student {
var instance: Student = null
var clazz = "class1"
def apply(name: String, age: Int) = {
if (instance == null) instance = new Student(name, 25)
instance
}
}
Student类对他的所有构造使用了private来修饰,这样外部就无法通过new的方式来获取他的实例对象。然后在他的伴生对象中,使用apply方法,来创建class的实例。其余的实现就和Java的一样了,apply方法在scala语法中用的挺多的,List.apply(1,2,3,4)就会返回一个List集合,一般apply方法配合伴生对象使用,调用的时候非常方便。
val s = Student("Cyony", 25)
println(s.toString)
#结果
My name is Cyony and age is 25. I am from class1
直接使用Student的伴生对象中的apply方法,传入参数,自动生成一个单例的Student Class对象,非常的方便。