我认为下面的代码最能描述我的问题:
import scala.collection.mutable.Set
case class CrazyClass(i: Int) {
override def toString: String = s"CrazyClass[ i=$i ]"
CrazyClass.registeredClasses += this
}
object CrazyClass extends App{
val registeredClasses = Set[CrazyClass]()
CrazyClass(1); CrazyClass(2)
registeredClasses.foreach(println(_))
}
这将按预期打印:
CrazyClass[ i=2 ]
CrazyClass[ i=1 ]
但是如果我尝试使用从CrazyClass
扩展的对象执行此操作,该对象不会自动注册:
object CrazyExtendedObject extends CrazyClass(4) {
def something = 2
}
添加代码的输出仍然与上面的输出相同。如果我添加一个普通的扩展类,如下所示,则一切正常:
class CrazyExtendedClass(i: Int) extends CrazyClass(i)
新类的每个实例都将被注册。
那么如何在对象上实现相同的结果呢?
只需从您的App
中引用CrazyExtendedClass
即可。
单例是延迟加载的,因此初始值设定项在您请求之前不会运行。