Подтвердить что ты не робот

Переопределение Scala Значение перечисления

Насколько я могу судить, Scala имеет определения для класса Value Enumeration для Value (Int), Value (String) и Value (Int, String).

Кто-нибудь знает пример создания нового подкласса Value для поддержки другого конструктора?

Например, если я хочу создать объекты Enumeration with Value (Int, String, String), как мне это сделать? Я бы хотел, чтобы все другие преимущества использования класса Enumeration.

Спасибо.

4b9b3361

Ответ 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>