Переопределить toString в scala enumeratum

Скажем, у меня определено следующее перечисление:

import enumeratum._
import enumeratum.EnumEntry.Lowercase

import scala.collection.immutable

sealed trait Day extends EnumEntry with Lowercase

object Day extends Enum[Day]{
  case object MON extends Day
  case object TUE extends Day
  case object WED extends Day
  /* ... */
  override def values: immutable.IndexedSeq[Day] = findValues
}
println(Day.Mon)           // MON, but I would like to see mon instead
println(Day.Mon.entryName) // mon

Я хотел бы отменить Day.toStringчтобы вернуть имя записи вместо имени класса. Но похоже, что это не так интуитивно понятно.

Что я пробовал:

  1. Отменить вручную toString возвращаться entryName:
sealed trait Day extends EnumEntry with Lowercase {
  override def toString: String = entryName
}

Но он вызывает StackruError (связанный с ленивым val):

Exception in thread "main" java.lang.StackruError
    at example.Day$MON$.enumeratum$EnumEntry$$stableEntryName(Day.scala:17)
    at enumeratum.EnumEntry.entryName(EnumEntry.scala:21)
    at enumeratum.EnumEntry.entryName$(EnumEntry.scala:21)
    at example.Day$MON$.enumeratum$EnumEntry$Lowercase$$super$entryName(Day.scala:17)
    at enumeratum.EnumEntry$Lowercase.enumeratum$EnumEntry$Lowercase$$stableEntryName(EnumEntry.scala:122)
    at enumeratum.EnumEntry$Lowercase.enumeratum$EnumEntry$Lowercase$$stableEntryName$(EnumEntry.scala:122)
    at example.Day$MON$.enumeratum$EnumEntry$Lowercase$$stableEntryName$lzycompute(Day.scala:17)
    at example.Day$MON$.enumeratum$EnumEntry$Lowercase$$stableEntryName(Day.scala:17)
    at enumeratum.EnumEntry$Lowercase.entryName(EnumEntry.scala:120)
    at enumeratum.EnumEntry$Lowercase.entryName$(EnumEntry.scala:120)
    at example.Day$MON$.entryName(Day.scala:17)
    at example.Day.toString(Day.scala:13)
    at example.Day.toString$(Day.scala:13)
    at example.Day$MON$.toString(Day.scala:17)
    at enumeratum.EnumEntry.enumeratum$EnumEntry$$stableEntryName(EnumEntry.scala:23)
    at enumeratum.EnumEntry.enumeratum$EnumEntry$$stableEntryName$(EnumEntry.scala:23)
    at example.Day$MON$.enumeratum$EnumEntry$$stableEntryName$lzycompute(Day.scala:17)
    at example.Day$MON$.enumeratum$EnumEntry$$stableEntryName(Day.scala:17)
  1. Укажите, какой именно super метод использования:

sealed trait Day extends EnumEntry with Lowercase {
  override def toString: String = super[Lowercase].entryName
}

Но все же ГП.

  1. Я знаю, что это возможно с ручным переопределением имени записи, но для этого требуется написать шаблонный код:

abstract class Day(override val entryName: String) extends EnumEntry {
  override def toString: String = entryName
}

object Day extends Enum[Day]{
  case object MON extends Day("mon")
  case object TUE extends Day("tue")
  case object WED extends Day("wed")
  /* ... */
  override def values: immutable.IndexedSeq[Day] = findValues
}
  1. Хорошо работает с StringEnum но опять же, мне нужно будет написать шаблонный код для литералов.

0 ответов

Другие вопросы по тегам