Переопределение Scala Значение перечисления
Насколько я могу судить, Scala имеет определения для класса Value Enumeration для Value (Int), Value (String) и Value (Int, String).
Кто-нибудь знает пример создания нового подкласса Value для поддержки другого конструктора?
Например, если я хочу создать объекты Enumeration with Value (Int, String, String), как мне это сделать? Я бы хотел, чтобы все другие преимущества использования класса Enumeration.
Спасибо.
Ответы
Ответ 1
Значения Enumeration являются экземплярами класса Val. Этот класс может быть расширен и может быть добавлен метод factory.
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
Ответ 2
Фактически в Scala Перечисление имеет гораздо более простой смысл, чем в Java. Для вашей цели вам не нужно подклассифицировать перечисление или его значение каким-либо образом, вам просто нужно создать свой собственный тип в своем сопутствующем объекте как val
. Таким образом, вы получите знакомую модель доступа val value:MyEnum = MyEnum.Value
, как в Java, что невозможно в примере, представленном Томасом Юнгом. Там у вас будет 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 Лучшие практики: Наследование признаков и перечисление
Ответ 3
Вот еще один более простой подход:
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>