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

时间:2017-02-22 12:10:41

标签: scala object traits

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

如果我有这个对象:

  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
}

但是,当我更改案例对象以将其打包为特征时:

trait model{
  case object StartMessage
}

然后我的课程将声明如下:

class Test1 extends model{
class Test2 extends model{

我收到:

45c8e616
7d417077

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

* 2。是否有另一种获取功能的方法来添加"相同的对象只有扩展特性到具体类,而不是让它们在整个应用程序中可见?案例是要有更清晰的代码,有可能"标记"作为"他们使用这些对象,而其他人不会"

1 个答案:

答案 0 :(得分:2)

在特质中定义的对象是给定特征范围的单例。它实际上指的是特征的实例,而不是特征本身。结果是你看到的行为 - >每个实例创建对象。这导致了这样的结论:您无法通过扩展特征来定义对象以在不同的类之间共享。前段时间也有类似的问题,我稍后会尝试找到它。

就个人而言,我会去某些类的上下文来提供共享资源。