在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(),但scala枚举,在我看来,缺乏此功能。除了在scala代码中使用java enum之外,你知道其他任何解决方法吗?
答案 0 :(得分:2)
查看Case objects vs Enumerations in Scala
在Scala中,Enumeration具有有限的功能,如果您希望将功能添加到Enumeration,则最好具有密封特征。 例如:
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
}
同样在你的情况下,它有点棘手,因为你想在初始化之前引用一个值。所以在最后一个定义上有一个懒惰(如果你愿意,你也可以将下一个定义为def)
答案 1 :(得分:2)
如果您希望使用标准Scala Enumeration#Value
来实现此行为,则可以将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
重新定义为枚举的实例:
android:configChanges
但是,由于枚举由于so many reasons而不好,并且没有一致的IDE支持,我个人会使用密封特征与枚举的案例对象(检查enumeratum)允许由于能够精确控制正在发生的事情,为我的枚举引入任意逻辑。