scala Enumeration中的ordinal()方法

时间:2016-06-19 19:36:26

标签: scala enums

在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之外,你知道其他任何解决方法吗?

2 个答案:

答案 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)允许由于能够精确控制正在发生的事情,为我的枚举引入任意逻辑。