Scala伴生对象并非单例?关于单例定义的理解困惑咨询
理解Scala中Class与伴生Object的区别
嘿,这个问题核心是你混淆了Scala里class和object的角色,我来帮你理清思路:
首先,你写的class A(name: String)是一个普通的可实例化类——它和Java等语言里的类完全一样,只要通过new关键字就能创建任意多个实例,这也是你能得到a和b两个不同对象的原因,这部分完全符合常规面向对象的逻辑。
而你定义的object A是class A的伴生对象,它才是Scala实现单例的载体:
- 这个
object A本身就是一个唯一的实例,你不需要(也不能)用new去创建它,直接通过A就能引用到这个单例对象 - 比如你可以在
main方法里加一行println(A),不管你打印多少次,输出的都是同一个对象地址,这才是单例定义的体现
你的理解偏差在于:把class A和它的伴生对象object A当成了同一个实体,但实际上它们是两个独立的东西——单例的约束是针对object A的,它确实只有一个实例;而class A本身就是设计用来生成多个实例的,所以你的代码并没有违背单例的定义哦。
如果想让A类型真正成为单例(外部无法创建多个实例),你可以把class A设为私有,通过伴生对象提供唯一实例,比如:
object A { private class AImpl(name: String) {} // 对外提供唯一实例 val singletonInstance = new AImpl("Vinod") }
这样外部就无法通过new创建AImpl的实例,只能通过A.singletonInstance获取唯一的那个对象。
内容的提问来源于stack exchange,提问作者Vinod Chandak
相关产品推荐
相关产品推荐

