gpt4 book ai didi

scala - 在定义它的文件中导入 Scala 伴随对象

转载 作者:行者123 更新时间:2023-12-04 17:54:33 24 4
gpt4 key购买 nike

我有一个 ThisThing.scala 文件,其中包含:

class ThisThing() extends BaseThing[ThisEvent, ThisState]
object ThisThing {
sealed trait ThisEvent
case class Load(uuid: UUID) extends ThisEvent
case object Stop extends ThisEvent

sealed trait ThisState
case object Loading extends ThisState
case object Loaded extends ThisState
}

ThisThing 需要通过它处理的事件类型和状态进行参数化。这还需要导入:
import ThisThing._ 

这感觉真的很奇怪,不得不从同一个文件中导入一些东西。我猜我正在做一些非惯用的事情,并且有更好的方法来构建它?

最佳答案

这有点奇怪,但原则上是有效的。

这是不惯用的,因为你试图隐藏 ThisEventThisStateThisThing的伴随对象,但同时您在 ThisThing ... extends BaseThing[ThisEvent, ThisState] 的签名中公开这些类型.

问题不仅是你,还有ThisThing的每一位用户必须打开包装ThisThing s 伴生对象,以便记下类型 BaseThing[ThisEvent, ThisState] :

// much later, in someone else's code in a galaxy far, far away 
import foo.bar.baz.ThisThing.{ThisEvent, ThisState} // awkward to use!
val t: BaseThing[ThisEvent, ThisState] = new ThisThing

所以... 如果您认为有人想要访问 ThisEventThisState稍后,然后将它们移出 ThisThing伴侣。

如果您认为没有人甚至应该知道 ThisThing实际上是一个 BaseThing[X, Y] ,那么无论如何你都会有一个抽象泄漏,你可以通过声明 ThisThing 来处理它。作为特征,然后实现一个扩展 ThisThing 的具体类和 BaseThingThisThing的伴生对象,因此 BaseThing不会泄漏到外面。

总而言之,这是两种情况之一:
  • 场景一:BaseThing[ThisEvent, ThisState]从外面应该是可见的。在这种情况下,ThisEventThisState埋在伴生物体中有点太深,因此很难访问。
  • 场景二:BaseThing[ThisEvent, ThisState]是一个抽象泄漏。

  • 只是一个随机猜测:如果你只是想参数化像 Akka FSM 这样的东西,就让它现在保持原样。我认为这很常见,因为没有人真正关心 Actor 是如何实际实现的。不可能获得对 ThisThing 的明确引用无论如何,因为你所看到的只有 ActorRef s,以便隐藏实际实例。在这种情况下,“抽象泄漏”并不太重要,因为没有人会看到 FSM 的实际实例。

    关于scala - 在定义它的文件中导入 Scala 伴随对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48912712/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com