对具有特征用法的案例对象的引用
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上也有类似的问题,稍后再找找。
就我个人而言,我会向 类 传递某种上下文以提供共享资源。
我遇到了一些不太明白的事情,所以让我们开始吧:
如果我有这个对象:
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上也有类似的问题,稍后再找找。
就我个人而言,我会向 类 传递某种上下文以提供共享资源。