Ho già guardato il e case classes vs. Enumeration ma sembra troppo sforzo per troppo meno beneficio.Enumerazioni Scala con oggetti Singleton come elementi di enumerazione e possibilità di scorrere su di essi?
Fondamentalmente mi piacerebbe avere un metodo values
restituendo tutti gli oggetti singleton di DayOfWeek
senza ripetermi alcune volte.
Ecco come il mio codice dovrebbe essere simile:
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)
Il metodo values
dovrebbe restituire qualcosa come se fosse stata scritta in questo modo:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
Tutto dovrebbe accadere in MyEnum
trait così Ho solo bisogno di estenderlo per ottenere la funzionalità.
trait MyEnum {
val values = this.getClass.getField("MODULE$") etc. etc.
}
Qualsiasi suggerimento come questo potrebbe essere fatto esattamente? L'idea è che values
accede alla classe e trova tutti gli oggetti singleton della classe che stanno estendendo.
Modifica: Sembra che tutti i suggerimenti non tengano conto che l'utente può anche creare oggetti che dovrebbero ovviamente essere paragonabili a quelli definiti.
Cercherò di fare un altro esempio, forse è più chiaro:
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!"
voglio avere un tratto (MyEnum
), che posso mescolare in oggetto che contiene i miei "oggetti di enumerazione" con metodi per restituirne un elenco (def values: List[MonthDay]
) o iterare su di essi (def next: MonthDay
o def previous: MonthDay
).
PPS: I created a new question for the second part of this question come richiesto da Ken Bloom.
potrebbe ripeti la tua domanda modificata come una nuova domanda (formulata come una domanda di riflessione)? Non ha davvero nulla a che fare con Enumerations. –
la funzione 'add' che ho proposto è ancora una soluzione praticabile alla domanda modificata. –
@Ken Bloom: Fatto, eccolo: http://stackoverflow.com/questions/4239594/how-to-access-objects-within-an-object-by-mixing-in-a-trait-with-reflection – soc