在java中,我得到了枚举
enum Num {
ONE,
TWO,
THREE;
private static Num current = ONE;
private static Num next = TWO;
public Num getNext(){
return values()[(ordinal() + 1) % values().length];
}
public static Num getNextNum(){
next = current.getNext()
}
}因此,我能够以调用getNextNum()的方式赋值next,但是在我看来,scala枚举缺少这个特性。除了在scala代码中使用java枚举之外,你还知道其他的解决方法吗?
发布于 2016-06-20 05:03:39
看一看Case objects vs Enumerations in Scala
在Scala中,枚举的功能有限,如果您想将功能添加到枚举中,最好使用密封的特征。例如:
sealed trait Num {
val next: Num
}
case object ONE extends Num {
override val next = TWO
}
case object TWO extends Num {
override val next = THREE
}
case object THREE extends Num {
override lazy val next = ONE
}同样在你的例子中,这有点棘手,因为你想在初始化之前引用一个值。所以在最后一个定义上有一个延迟(如果你愿意,你也可以把next定义为def )
发布于 2016-06-20 16:38:55
如果你想使用标准的Scala来实现这个行为,你可以将Enumeration#Value重新定义为你的Enumeration的实例:
object Num extends Enumeration {
case class MyValue() extends Val {
def next: MyValue = Num((id + 1) % Num.values.size).asInstanceOf[MyValue]
}
val One, Two, Three = MyValue()
}
Num.One.next
// res0: Num.MyValue = Two然而,由于枚举是糟糕的,因为so many reasons,以及没有一致的集成开发环境支持,我个人会对枚举的case对象使用密封的特征(请查看enumeratum),它允许为我的枚举引入任意逻辑,因为它可以精确地控制发生的事情。
https://stackoverflow.com/questions/37911081
复制相似问题