I would like to extend Scala's implementation of Enumeration
with a custom field, say label
. That new field should be accessible via the values
of that enumeration. Furthermore, that custom field should be part of various implementations of Enumeration
.
I am aware of the following questions at Stackoverflow:
- How to add a method to Enumeration in Scala?
- How do I create an enum in scala that has an extra field
- Overriding Scala Enumeration Value
- Scala doesn't have enums - what to use instead of an enum
However, none of them solves my issues:
The first issue is that I am able to add a custom field. However, I cannot access that additional field via the Values
returned by Enumeration.values
. The following code works and prints 2nd enumeration value
:
object MyEnum extends Enumeration {
type MyEnum = MyVal
val VALUE_ONE = MyVal()
val VALUE_TWO = MyVal(Some("2nd enumeration value"))
val VALUE_THREE = MyVal(Some("3rd value"))
case class MyVal(label: Option[String] = None) extends Val(nextId)
}
import MyEnum._
println(VALUE_TWO.label.get)
Note that I access the label via one of the values. The following code does not work:
for (value <- MyEnum.values) println(value.label)
The error message is as follows: error: value label is not a member of MyEnum.Value
Obviously, instead of MyEnum.MyVal
, MyEnum.Val
is used. The latter does not define label
, while my custom value would provide field label
.
The second issue is that it seems to be possible to introduce a custom Value
and Val
, respectively, in the context of an Enumeration
only. Thus, as far as I know, it is not possible to use such a field across different enums. At least, the following code does not compile:
case class MyVal(label: Option[String] = None) extends Enumeration.Val(nextId)
object MyEnum extends Enumeration {
type MyEnum = MyVal
val VALUE_ONE = MyVal()
val VALUE_TWO = MyVal(Some("2nd enumeration value"))
}
object MySecondEnum extends Enumeration {
type MySecondEnum = MyVal
val VALUE_ONE = MyVal()
val VALUE_TWO = MyVal(Some("2nd enumeration value"))
}
Due to the fact that class Val
is protected, case class MyVal
cannot access Val
-- MyVal
is not defined in the context of an enumeration.
Any idea how to solve the above issues?