利用伴生对象构建Scala单例

    在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对象,非常的方便。


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值