Enum Entry Names with Enumeratum


Scala’s built-in enums don’t provide a clean way to control how each case maps to a string name. Enumeratum fills that gap.

Add the dependency:

libraryDependencies += "com.beachape" %% "enumeratum" % "1.7.3"

Uniform name transformation

Mix in a naming rule and every entry gets a transformed name automatically:

import enumeratum.EnumEntry._
import enumeratum._

sealed trait Color extends EnumEntry with Lowercase
object Color extends Enum[Color] {
  override def values: IndexedSeq[Color] = findValues
  case object Red extends Color
  case object Green extends Color
}
val c1 = Color.Red.entryName
// c1: String = "red"
val c2 = Color.Green.entryName
// c2: String = "green"

Switching to Uppercase requires only changing the mixin:

sealed trait Color extends EnumEntry with Uppercase
val c1 = Color.Red.entryName
// c1: String = "RED"
val c2 = Color.Green.entryName
// c2: String = "GREEN"

Per-entry overrides

When requirements are inconsistent — perhaps due to a legacy API that mixes naming conventions — override entryName on specific entries:

import enumeratum.EnumEntry._
import enumeratum._

sealed trait Color2 extends EnumEntry with Lowercase
object Color2 extends Enum[Color2] {
  override def values: IndexedSeq[Color2] = findValues
  case object Red extends Color2
  case object Green extends Color2 {
    override def entryName: String = "GREEN"
  }
}

The Lowercase rule applies to all entries; Green overrides it selectively:

val c3 = Color2.Red.entryName
// c3: String = "red"
val c4 = Color2.Green.entryName
// c4: String = "GREEN"

The default rule handles the common case; the override handles the exception. No special-casing in the call site.