我遇到了一些我不太了解的事情,所以让我们开始吧:
如果我有这个对象:
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。是否有另一种获取功能的方法来添加"相同的对象只有扩展特性到具体类,而不是让它们在整个应用程序中可见?案例是要有更清晰的代码,有可能"标记"作为"他们使用这些对象,而其他人不会"
答案 0 :(得分:2)
在特质中定义的对象是给定特征范围的单例。它实际上指的是特征的实例,而不是特征本身。结果是你看到的行为 - >每个实例创建对象。这导致了这样的结论:您无法通过扩展特征来定义对象以在不同的类之间共享。前段时间也有类似的问题,我稍后会尝试找到它。
就个人而言,我会去某些类的上下文来提供共享资源。