私の知る限り、Scalaには、Value(Int)、Value(String)、およびValue(Int、String)の列挙値クラスの定義があります。
別のコンストラクターをサポートするために新しいValueサブクラスを作成する例を知っている人はいますか?
たとえば、Value(Int、String、String)オブジェクトを使用して列挙型を作成する場合、どのようにすればよいですか? Enumerationクラスを使用する他のすべての利点が欲しいです。
ありがとう。
列挙値はValクラスのインスタンスです。このクラスは拡張でき、ファクトリメソッドを追加できます。
object My extends Enumeration {
val A = Value("name", "x")
val B = Value("other", "y")
class MyVal(name: String, val x : String) extends Val(nextId, name)
protected final def Value(name: String, x : String): MyVal = new MyVal(name, x)
}
scala> My.B.id
res0: Int = 1
scala> My.B.x
res1: String = y
実際、Scala列挙型は、Javaよりもはるかに単純な意味を持っています。目的のために、列挙型やその値をサブクラス化する必要はありません。独自の型をインスタンス化するだけです。 val
としてのコンパニオンオブジェクト。このようにして、Javaで提供された例では不可能な、val value:MyEnum = MyEnum.Value
の使い慣れたアクセスモデルを取得します。 ThomasJung。そこにはdef value:My.MyVal = MyEnum.Value
がありますが、これは、ソリューションのすべてのハック性に加えて、私にはちょっと混乱しているようです。これが私が提案するものの例です。
class MyEnum(myParam:String)
object MyEnum {
val Value1 = new MyEnum("any parameters you want")
val Value2 = new MyEnum("")
object Value3 extends MyEnum("A different approach to instantialization which also lets you extend the type in place")
}
ここでは、より複雑な例を見つけることができます: Scalaのベストプラクティス:特性の継承と列挙
もう1つの簡単なアプローチは次のとおりです。
scala> :paste
// Entering paste mode (ctrl-D to finish)
object Colors extends Enumeration {
sealed case class Color private[Colors](hexCode: String, name: String) extends Val(name)
val Black = Color("#000000", "black")
val White = Color("#FFFFFF", "white")
}
// Exiting paste mode, now interpreting.
defined object Colors
scala> Colors.Black.hexCode
res0: String = #000000
scala> Colors.Black.name
res1: String = black
scala> Colors.values
res2: Colors.ValueSet = Colors.ValueSet(black, white)
scala>
Enumeration.Val
クラスを拡張して実行したいと思います。
あなたの要件のために、私は以下のサンプルを投稿します:
object FileType extends Enumeration {
val csv = Val(1,"csv", ",")
val tsv = Val(2,"tsv", "\t")
protected case class Val(num: Int, fileType: String, delimiter: String) extends super.Val
implicit def valueToFileType(x: Value): Val = x.asInstanceOf[Val]
}
値へのアクセスは次のとおりです。
scala> FileType.csv
res0: FileType.Val = csv
scala> FileType.csv.delimiter
res29: String = ,