首页 > 解决方案 > 班级间信息交流

问题描述

我必须在它们的 UID 的帮助下将多个对象相互链接,所以我想出了第一个无法编译的代码,然后我得到了这个我不理解的解决方案。

import java.util.UUID
def generate = UUID.randomUUID()

//DOESN'T COMPILE, cannot resolve BigBrand.id
//case class BigBrand (name : String, id : UUID = generate)
//case class Outlet(name: String, big_brand_id: UUID = BigBrand.id, id : UUID = generate)

//SOLUTION ?
object BigBrand {
  case class Id(value: UUID)
}
case class BigBrand (name : String, id : BigBrand.Id = BigBrand.Id(generate))

object Outlet {
  case class Id(value: UUID)
}
case class Outlet(name: String, big_brand_id: BigBrand.Id, id : Outlet.Id = Outlet.Id(generate))

val tutu=BigBrand("tutu")
val toto=BigBrand("toto")
println(s"BigBrand id : ${tutu.id}")
println(s"BigBrand id : ${toto.id}")
val tutu1=Outlet("tutu1",tutu.id)
val toto2=Outlet("toto2",toto.id)
println(s"Outlet id : ${tutu1.id} linked with : ${tutu1.big_brand_id}" )
println(s"Outlet id : ${toto2.id} linked with :${toto2.big_brand_id}" )

标签: scalaclass

解决方案


这是失败的原始代码:

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您必须idBigBrand. BigBrand.id(如果存在的话)对于所有BigBrand实例都是一个常数。

有两种处理它的方法,这两种方法都需要你创建一个Outletusing Outlet(name, big_brand)

第一种方法是将BigBrand实例放在Outlet而不是仅仅放在id

case class Outlet(name: String, big_brand: BigBrand, id: UUID = generate) {
  def big_brand_id = big_brand.id
}

第二种方法是BigBrand在创建时传递实例Outlet并从中提取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)
}

这需要在创建BigBrand时提供a,并且在私有时使和可见。Outletnameidbig_brand_idbig_brand


推荐阅读