作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在一个项目中工作,我需要在其中标记收到的消息的类型。消息可以来自不同的来源,但所有这些来源都生成具有相同概念类型(因此,相同含义)但以不同方式编写的消息。
例如从 source1 我可以收到
来源1:
{
"message_type": "typeA",
"value": 3
...
}
{
"message_type": "typeB",
"value": 3
...
}
{
"message_type": "A",
"value": 5
...
}
{
"message_type": "B",
"value": 2
...
}
trait MessageType extends Enumeration {
val TYPE_A: Value
val TYPE_B: Value
}
object Source1MessageType extends MessageType{
override val TYPE_A: Value("typeA")
override val TYPE_B: Value("typeB")
object Source2MessageType extends MessageType{
override val TYPE_A: Value("A")
override val TYPE_B: Value("B")
def foo(type: MessageType.Value) {
type match{
case MessageType.TYPE_A => ...do A action...
case MessageType.TYPE_B => ...do B action...
}
}
最佳答案
是的,您可以进行分层枚举。所以一般我会建议不要使用 Enumeration
.这是一篇关于为什么不好的文章
https://medium.com/@yuriigorbylov/scala-enumerations-hell-5bdba2c1216
最惯用的方法是利用这样的密封特性:
sealed trait MessageType{
def value:String
}
sealed trait MessageType1 extends MessageType
final case object TypeA extends MessageType1{
override def value:String = "typeA"
}
final case object TypeB extends MessageType1{
override def value:String = "typeB"
}
sealed trait MessageType2 extends MessageType
final case object A extends MessageType2{
override def value:String = "A"
}
final case object B extends MessageType2{
override def value:String = "B"
}
sealed
和
final
告诉编译器继承只能发生在这个文件中。
MessageType2
的实例编译器知道它只能是对象
A
或
B
它不能是其他任何东西(因为密封/最终)
关于scala - 有没有办法在 Scala 中实现分层枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54589703/
我是一名优秀的程序员,十分优秀!