覆盖Scala枚举值

时间:2010-03-24 11:41:45

标签: scala enumeration

据我所知,Scala对Value(Int),Value(String)和Value(Int,String)的Enumeration Value类有定义。

有没有人知道创建新的Value子类以支持不同构造函数的示例?

例如,如果我想创建一个带有Value(Int,String,String)对象的Enumeration,我该怎么做?我想要使​​用Enumeration类的所有其他好处。

感谢。

4 个答案:

答案 0 :(得分:43)

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

答案 1 :(得分:1)

实际上在Scala Enumeration中的含义比在Java中简单得多。为了您的目的,您不必以任何方式子类化Enumeration及其Value,您只需要在其伴随对象中将您自己的类型实例化为val。通过这种方式,您将获得熟悉的Java val value:MyEnum = MyEnum.Value访问模型,这在Thomas Jung提供的示例中是不可能的。在那里你会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 Best Practices: Trait Inheritance vs Enumeration

答案 2 :(得分:0)

这是另一种更简单的方法:

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> 

答案 3 :(得分:0)

我更愿意通过扩展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 = ,