2016-11-16 10 views
1

私はscalaが新しく、簡単な新しいアクセス可能な定数を簡単に追加できる構造が必要です。このような 何か:Scala:個別のアクセスを持つ定数のリスト

object Constants { 
    val A = Something(...) 
    val B = Something(...) 
    val C = Something(...) 
    // ... 

    val listOfConstants = (A, B, C, ...) 
} 

しかし、手動でリストに定数を追加する必要はありません。 私は地図を検討したが、これはそれが難しいの定数を アクセスするためになるだろうと私はこれを書いてしまった:

def getElements[T : ClassTag](c : Any) : Set[T] = { 
    var result : Set[T] = Set() 
    for (field <- c.getClass.getDeclaredFields) { 
     field.setAccessible(true) 
     field.get(c) match { 
      case t: T => result += t 
      case _ => 
     } 
    } 
    result 
} 

をしてから、この

val listOfConstants = getElements[Something](Constants) 

のような構造のために次の行を使用して、このAは汚い解決策?より良い選択肢はありますか?

答えて

2

http://www.scala-lang.org/api/current/scala/Enumeration.htmlまたはHow to model type-safe enum types?などの列挙型を試してください。列挙型をJavaで記述してScalaから使用することもできます

たとえば、Scalaで使用できるJavaで定義されているenumがあります。可能なすべての値のマップが付属しているため、キーで取得できます値の繰り返しなどを行うことができます。値のマップは自動的に作成されるため、手動で更新する必要はありません。

import java.util.Collections; 
import java.util.Map; 
import java.util.HashMap; 

/** 
* Demonstrates parsing of an enum from the contained value 
*/ 
public enum WithFrom implements Something { 
    TWO("one plus 1"), SIX("two plus 4"); 

    WithFrom(String expr) { 
     this.expr = expr; 
    } 

    private final String expr; 

    public static final Map<String, WithFrom> fromValue = Collections 
      .unmodifiableMap(new HashMap<String, WithFrom>() { 
       private static final long serialVersionUID = 7205142682214758287L; 

       { 
        for (WithFrom wf : WithFrom.values()) { 
         put(wf.expr, wf); 
        } 
       } 
      }); 
} 
+0

おかげで、私の場合には 'Something'は...様々なサブタイプとすることができるA、B、C、から抽象型です。私の知る限り、列挙型は拡張できません。 – ChrisU

+0

Java enumはインターフェイスを実装できます。助けてくれますか? – radumanolescu

1

あなたはEnumerationを作成し、そのvalues: ValueSetメソッドを使用することができます。

3

スカラーのデフォルトのEnumerationを使用できますが、独自のcaveatsです。私が知っている最高のenumarationライブラリはEnumeratumです。

object MyEnum extends Enum[Something] { 

    val values = findValues 

    case object A extends Something 
    case object B extends Something 
    case object C extends Something 
    case object D extends Something 

} 

findValuesが自動的にコンパイル時に(MyEnum内側)Somethingのすべてのサブオブジェクトを検索し、マクロである:それはあなたがこのような何かを書くことができます。

SBTを使用して、このLIBを追加するには:答えを

libraryDependencies += "com.beachape" %% "enumeratum" % "1.4.0" 
関連する問題