scala - 班级间信息交流
问题描述
我必须在它们的 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}" )
解决方案
这是失败的原始代码:
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
您必须id
为BigBrand
. BigBrand.id
(如果存在的话)对于所有BigBrand
实例都是一个常数。
有两种处理它的方法,这两种方法都需要你创建一个Outlet
using 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,并且在私有时使和可见。Outlet
name
id
big_brand_id
big_brand
推荐阅读
- vue.js - 值输入中的vue 3问题
- javascript - ReactJs - 我的 POST 请求总是空的
- flutter - 颤振 gen-l10n 与 l10n.yaml
- excel - 如何使用具有二进制约束的求解器插件
- racket - 尝试与 Racket 中的字符串进行模式匹配以将它们附加在一起
- node.js - 节点版本管理器
- vue.js - CapacitorJs:Vue 3 + 本地通知不起作用问题
- java - .jar 文件错误“无法找到或加载主类”与 IntelliJ
- flutter - 如何从 url 加载 csv 并显示为 listview flutter
- node.js - 如何在 reactJs NodeJs web APP 中维护 Session?