Use ValueEnums for primitive mappings
masterValueEnums allow you to map enum members to primitive values like Int, Long, Short, Char, Byte, or String. Unlike standard Enums, ValueEnums enforce compile-time uniqueness of values.
IntEnum Example
import enumeratum.values._
sealed abstract class LibraryItem(val value: Int, val name: String) extends IntEnumEntry
object LibraryItem extends IntEnum[LibraryItem] {
val values = findValues
case object Book extends LibraryItem(value = 1, name = "book")
case object Movie extends LibraryItem(name = "movie", value = 2)
case object Magazine extends LibraryItem(3, name = "magazine")
case object CD extends LibraryItem(4, name = "cd")
}
LibraryItem.withValue(1) // LibraryItem.BookAllowing Aliases
If you want multiple entries to share the same value, extend the enumeratum.values.AllowAlias trait.
sealed abstract class Judgement(val value: Int) extends IntEnumEntry with AllowAlias
object Judgement extends IntEnum[Judgement] {
case object Good extends Judgement(1)
case object OK extends Judgement(2)
case object Meh extends Judgement(2)
case object Bad extends Judgement(3)
val values = findValues
}Restrictions:
- Values must be literal values (not variables).
withValuereturns an undefined entry if multiple entries share the same value (when usingAllowAlias).
import enumeratum.values._
sealed abstract class LibraryItem(val value: Int, val name: String) extends IntEnumEntry
object LibraryItem extends IntEnum[LibraryItem] {
case object Book extends LibraryItem(value = 1, name = "book")
case object Movie extends LibraryItem(name = "movie", value = 2)
case object Magazine extends LibraryItem(3, name = "magazine")
case object CD extends LibraryItem(4, name = "cd")
// case object Newspaper extends LibraryItem(4, name = "newspaper") <-- will fail to compile because the value 4 is shared
/*
val five = 5
case object Article extends LibraryItem(five, name = "article") <-- will fail to compile because the value is not a literal
*/
val values = findValues
}
assert(LibraryItem.withValue(1) == LibraryItem.Book)
LibraryItem.withValue(10) // => java.util.NoSuchElementException: