scala - Scala:使用 Trait + Companion 对象枚举实现
问题描述
我的问题是:这是一个反模式:
我有一个密封的 scala 特征,有十几个或两个实现 - 说这样的话:
package com.erik.logic
sealed trait FailureReason {
def why: String
}
case object A extends FailureReason {
val why = "just because"
}
case class B(why: String) extends FailureReason
// ...
case object Z extends FailureReason {
val why = "idk"
}
导入可能会变得丑陋(或 6 以上,._
根据我读过的大多数样式指南开始使用样式)。
一种选择是将它们全部放在特征的伴随对象中,然后我可以以类似于枚举的方式导入和引用它。 这是反模式吗?
package com.erik.logic
trait FailureReason {
def why: String
}
object FailureReason
case object A extends FailureReason { ... }
case class B(why: String) extends FailureReason
// ...
}
// otherFile.scala
import com.erik.logic.FailureReason
... reason match {
case FailureReason.A => something
case FailureReason.B(y) => other(y)
case FailureReason.C => etc
}
// yetAnotherFile.scala
import com.erik.logic.FailureReason.{A, B, J, Q}
// ... badThing match {
case SomethingBad => ReasonWrapper(A)
case SomethingTerrible => ReasonWrapper(B("terrible"))
case SomethingMeh => ReasonWrapper(Q)
}
解决方案
这不是“反模式”,没关系。您可以顺便说一句,在包级别以相同的方式导入:import com.erik.logic.{A, B, J, Q}
,因此无需将它们放入对象中(但如果您仍然想这样做,它也没有任何问题)。
请注意,您可能应该做出自己的 trait sealed
。case
这样,如果您忘记了某些子句,您可以利用编译器警告您,并且您match
的子句并不详尽。
推荐阅读
- asp.net-core-mvc - 为什么在脚手架代码中发布编辑操作时,会根据模型/隐藏输入中的 ID 检查 URL 中的 ID?
- ffmpeg - GStreamer H264 流到 HTML5 网页
- javascript - React Native 在抽屉导航屏幕上显示标题和后退按钮
- autohotkey - AutohotKey 控件 + 逗号在浏览器的新窗口中打开选项卡
- r - 如何校准具有点(不是概率)作为变量的模型?
- android - 如何创建在背景中有圆圈和在顶部有图像的布局?
- android - 使用 flutter_bluetooth_serial 在两个(或更多)Flutter 应用程序之间进行通信
- r - 数据框中各列的最大组合总和
- css - 无限水平动画:如何使其平滑?
- c# - 如何使用 Fluent NHibernate 从自定义 DriverConnectionProvider 读取配置值?