Ya miré y case classes vs. Enumeration pero parece demasiado esfuerzo para obtener un beneficio menor.Enumeraciones Scala con objetos Singleton como elementos de enumeración y la posibilidad de iterar sobre ellos?
Básicamente me gustaría tener un método values
devolviendo todos los objetos simples de DayOfWeek
sin repetirme algunas veces.
Así es como mi código debería ser similar:
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étodo values
debe devolver algo así como si hubiera sido escrito así:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
Todo debe suceder en el rasgo MyEnum
por lo 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 que values
acceda a la clase y encuentre todos los objetos únicos 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, deben ser comparables a los definidos.
Voy a tratar de dar otro ejemplo, tal vez es 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 sostiene 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
o def previous: MonthDay
).
PPS: I created a new question for the second part of this question según lo solicitado por Ken Bloom.
podría vuelva a hacer su pregunta modificada como una nueva pregunta (expresada como una pregunta de reflexión)? Realmente no tiene nada que ver con Enumerations. –
la función 'agregar' que he propuesto sigue siendo una solución factible para su pregunta modificada. –
@Ken Bloom: listo, aquí está: http://stackoverflow.com/questions/4239594/how-to-access-objects-within-an-object-by-mixing-in-a-trait-with-reflection – soc