2016-06-19 3 views
1

は、それが私には思えるように私は、getNextNum()を呼び出すことな方法で次の割り当てることができんだけど、Scalaの列挙型序()メソッド

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() 
    } 
} 

言いますこの機能が欠けています。スカラーコードでjava enumを使用する以外は、他の回避策を知っていますか?

答えて

2

ScalaでCase objects vs Enumerations in 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 
} 

、それは少しトリッキーです。

2

標準のScala Enumerationを使用してこの動作を実現したい場合は、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 

列挙型が原因so many reasonsに悪いだけでなく、一貫性のあるIDEをサポートしていないので、私は個人的に列挙型用のケースオブジェクトで封止さ特性を使用することになりに(enumeratumをチェックしてください)何が起こっているのかを正確に制御するために私のenumsのために。

+0

これは私が探しているものですが、var current = current.nextを変更しようとしているときに、タイプの必要性がMyValue.typeであることがNum.MyValueであることを意味します。 – Dmitrii

関連する問題