Enumerações de Scala com objetos Singleton como elementos de enumeração e uma possibilidade de iterar sobre eles?
Eu já olhei para oPergunta Scala sobre a emulação de Javaenum
eclasses de caso x enumeração mas parece muito esforço para menos benefícios.
Basicamente, eu gostaria de ter umvalues
método retornando todos os objetos singleton deDayOfWeek
sem me repetir algumas vezes.
É assim que meu código deve ficar:
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)
O métodovalues
deve retornar algo como se tivesse sido escrito assim:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
Tudo deve acontecer noMyEnum
característica, então eu só preciso estendê-lo para obter a funcionalidade.
trait MyEnum {
val values = this.getClass.getField("MODULE$") etc. etc.
}
Alguma sugestão de como isso poderia ser feito exatamente? A ideia é quevalues
acessa a classe e localiza todos os objetos singleton da classe que eles estão estendendo.
Editar: parece que todas as sugestões não levam em conta que o usuário também pode criar objetos que, obviamente, devem ser comparáveis aos definidos.
Vou tentar dar outro exemplo, talvez seja mais 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!"
Eu quero ter uma característica (MyEnum
) que eu posso misturar no objeto que contém meus "objetos de enumeração" com métodos para retornar uma lista deles (def values: List[MonthDay]
) ou itere sobre eles (def next: MonthDay
oudef previous: MonthDay
)
PPS:Eu criei uma nova pergunta para a segunda parte desta pergunta conforme solicitado por Ken Bloom.