Scala 班级之间的信息交流
我必须在UID的帮助下将几个对象相互链接起来,所以我提出了第一个没有编译的代码,然后我得到了这个我不理解的解决方案Scala 班级之间的信息交流,scala,class,Scala,Class,我必须在UID的帮助下将几个对象相互链接起来,所以我提出了第一个没有编译的代码,然后我得到了这个我不理解的解决方案 为什么我们需要一个伴生对象来将一个类引用到另一个类 您可以使用幻影类型模式,如下所示 import java.util.UUID def generate = UUID.randomUUID() case class Id[A](value: UUID) case class BigBrand (name : String, id : Id[BigBrand]) case c
- 为什么我们需要一个伴生对象来将一个类引用到另一个类
您可以使用幻影类型模式,如下所示
import java.util.UUID
def generate = UUID.randomUUID()
case class Id[A](value: UUID)
case class BigBrand (name : String, id : Id[BigBrand])
case class Outlet(name: String, big_brand_id: Id[BigBrand], id : Id[Outlet])
val tutu=BigBrand("tutu", Id(generate))
val toto=BigBrand("toto", Id(generate))
println(s"BigBrand id : ${tutu.id}")
println(s"BigBrand id : ${toto.id}")
val tutu1=Outlet("tutu1",tutu.id, Id(generate))
val toto2=Outlet("toto2",toto.id, Id(generate))
println(s"Outlet id : ${tutu1.id} linked with : ${tutu1.big_brand_id}" )
println(s"Outlet id : ${toto2.id} linked with :${toto2.big_brand_id}" )
这是一个证明型式试验有效的证据
scala> Outlet("hoge", toto2.id, toto2.big_brand_id)
^
error: type mismatch;
found : Id[Outlet]
required: Id[BigBrand]
^
error: type mismatch;
found : Id[BigBrand]
required: Id[Outlet]
这是失败的原始代码:
case class BigBrand (name: String, id: UUID = generate)
case class Outlet(name: String, big_brand_id: UUID = BigBrand.id, id: UUID = generate)
失败的原因是(根据评论)每个BigBrand
都有自己独特的id
。因此,当您创建Outlet
时,必须为BigBrand
的特定实例提供id
BigBrand.id
(如果存在)将是所有BigBrand
实例的常量
有两种处理方法,这两种方法都要求您使用Outlet(name,big_brand)
创建Outlet
第一种方法是将BigBrand
实例放在Outlet
中,而不仅仅是id
:
case class Outlet(name: String, big_brand: BigBrand, id: UUID = generate) {
def big_brand_id = big_brand.id
}
第二种方法是在创建Outlet
时传递BigBrand
实例,并从中提取id
:
case class Outlet private(name: String, big_brand_id: UUID, id: UUID)
object Outlet {
def apply(name: String, big_brand: BigBrand): Outlet =
Outlet(name, big_brand.id, generate)
}
最好的选择可能是两者的混合:
class Outlet private (val name: String, big_brand: BigBrand) {
val id = generate
def big_brand_id = big_brand.id
}
object Outlet {
def apply(name: String, big_brand: BigBrand): Outlet =
new Outlet(name, big_brand)
}
这要求在创建
Outlet
时提供BigBrand
,并使name
和id
和big\u brand\u id
可见,而big\u brand
是私有的。BigBrand的每个实例是否都有不同的id,或者对于BigBrand
的所有实例都是一样的?将一个类引用到另一个类是什么意思?所有类都必须有不同的id,这是为了区分每个实例。每个具有唯一uid的BigBrang实例都必须链接到具有唯一uidIt的Outlet实例。您想要的似乎可以在值级别而不是类型级别解决。你只需要这样做:final case class Outlet(name:String,big\u brand\u id:UUID,id:UUID=generate)
。这样它工作正常,我认为它解决了问题并回答了“为什么”的问题as well=>bcz类型定义应该以这种方式编写,以避免编译器混淆。我认为我们不需要使用伴生对象来解决这个问题,因为我已将注释和您的答案确定为编译器混淆。谢谢你的帮助!
class Outlet private (val name: String, big_brand: BigBrand) {
val id = generate
def big_brand_id = big_brand.id
}
object Outlet {
def apply(name: String, big_brand: BigBrand): Outlet =
new Outlet(name, big_brand)
}