¿Enumeraciones Scala con objetos Singleton como elementos de enumeración y una posibilidad de iterar sobre ellos?
Ya miré elPregunta de Scala sobre la emulación de Javaenum
yclases de caso vs. Enumeración pero parece demasiado esfuerzo por menos beneficio.
Básicamente me gustaría tener unvalues
método que devuelve todos los objetos singleton deDayOfWeek
sin repetirme algunas veces.
Así es como debería verse mi código:
object DayOfWeek extends MyEnum {
object MONDAY extends DayOfWeek(1)
object TUESDAY extends DayOfWeek(2)
object WEDNESDAY extends DayOfWeek(3)
object THURSDAY extends DayOfWeek(4)
object FRIDAY extends DayOfWeek(5)
object SATURDAY extends DayOfWeek(6)
object SUNDAY extends DayOfWeek(7)
}
class DayOfWeek(ordinal: Int)
El métodovalues
debería devolver algo como si se hubiera escrito así:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
Todo debería pasar en elMyEnum
rasgo, así que solo necesito extenderlo para obtener la funcionalidad.
trait MyEnum {
val values = this.getClass.getField("MODULE$") etc. etc.
}
¿Alguna sugerencia de cómo se puede hacer esto exactamente? La idea es quevalues
accede a la clase y encuentra todos los objetos singleton de la clase que están extendiendo.
Editar: Parece que todas las sugerencias no tienen en cuenta que el usuario también puede crear objetos que, por supuesto, deberían ser comparables a los definidos.
Trataré de dar otro ejemplo, tal vez sea más claro:
object MonthDay extends MyEnum {
//Some important holidays
object NewYear extends MonthDay( 1, 1)
object UnityDay extends MonthDay(11, 9)
object SaintNicholas extends MonthDay(12, 6)
object Christmas extends MonthDay(12, 24)
}
class MonthDay(month: Int, day: Int)
//Of course the user can create other MonthDays
val myBirthDay = new MonthDay(month, day)
if(!MonthDay.values.contains(myBirthDay)) "Well, I probably have to work"
else "Great, it is a holiday!"
Quiero tener un rasgo (MyEnum
) que puedo mezclar en el objeto que contiene mis "objetos de enumeración" con métodos para devolver una lista de ellos (def values: List[MonthDay]
) o iterar sobre ellos (def next: MonthDay
odef previous: MonthDay
)
PPS:Creé una nueva pregunta para la segunda parte de esta pregunta según lo solicitado por Ken Bloom.