【发布时间】:2011-05-13 05:23:03
【问题描述】:
我已经看过Scala question about emulating Java's enum和case classes vs. Enumeration,但似乎付出了太多的努力却收获了太少。
基本上,我希望有一个 values 方法返回 DayOfWeek 的所有单例对象,而无需重复几次。
我的代码应该是这样的:
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)
values 方法应该返回类似这样的写法:
val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
FRIDAY, SATURDAY, SUNDAY)
一切都应该发生在 MyEnum 特征中,所以我只需要扩展它即可获得功能。
trait MyEnum {
val values = this.getClass.getField("MODULE$") etc. etc.
}
有什么建议可以做到这一点吗?
这个想法是values 访问该类并找到它们正在扩展的类的所有单例对象。
编辑:似乎所有建议都没有考虑到用户也可以创建对象,这些对象当然应该与定义的对象相当。
我再举一个例子,也许更清楚:
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!"
我想要一个特征 (MyEnum),我可以将它混合到包含我的“枚举对象”的对象中,并使用返回它们列表的方法 (def values: List[MonthDay]) 或迭代它们 (def next: MonthDay 或 @ 987654338@).
PPS:I created a new question for the second part of this question 应 Ken Bloom 的要求。
【问题讨论】:
-
您能否将修改后的问题作为新问题重新提出(表述为反思问题)?它确实与枚举无关。
-
我提出的
add函数仍然是您修改后问题的可行解决方案。 -
@Ken Bloom:完成,这里是:stackoverflow.com/questions/4239594/…
标签: java reflection scala enums