对具有特征用法的案例对象的引用

References to case objects with trait usage

我遇到了一些不太明白的事情,所以让我们开始吧:

如果我有这个对象:

  case object StartMessage

像上面这样写,然后从两个不同的类:

获取它的引用
class Test2 {
  def print(){
    println(Integer.toHexString(System.identityHashCode(StartMessage)))
  }
}


class Test1 {
  def print(){
    println(Integer.toHexString(System.identityHashCode(StartMessage)))
  }
}

预期结果是:

object ActorMain extends App{
  new Test1().print()//45c8e616
  new Test2().print()//45c8e616
}

但是当我更改 case 对象以将其打包到特征中时:

trait model{
  case object StartMessage
}

然后我的 类 将有这样的声明:

class Test1 extends model{
class Test2 extends model{

我收到:

45c8e616
7d417077

*1。你能给我解释一下吗?我在想对象在整个应用程序中是一个,所以当我创建其中包含对象的特征时,每次我将扩展(使用 "with")这些特征时,对象将是相同的,而不是某种特征范围。

*2。是否有另一种方法可以仅通过将特征扩展到具体 类 来获得 "add" 相同对象的功能,而不是让它们对整个应用程序可见?案例是有更清晰的代码,有可能 "mark" 类 as "they use those objects, while others don't"

特征中定义的对象是给定特征范围的单例。它实际上指的是特征的实例,而不是特征本身。由此产生的行为就是您看到的行为 -> 对象是按实例创建的。这得出的结论是,您不能通过扩展特征来定义对象以在不同 类 之间共享。前段时间SO上也有类似的问题,稍后再找找。

就我个人而言,我会向 类 传递某种上下文以提供共享资源。