Java 使用单例对象作为枚举元素的Scala枚举,是否有可能对它们进行迭代?

Java 使用单例对象作为枚举元素的Scala枚举,是否有可能对它们进行迭代?,java,reflection,scala,enums,Java,Reflection,Scala,Enums,我已经看过了,但它似乎太多的努力太少的好处 基本上,我希望有一个values方法返回DayOfWeek的所有单例对象,而无需重复几次 我的代码应该是这样的: object DayOfWeek extends MyEnum { object MONDAY extends DayOfWeek(1) object TUESDAY extends DayOfWeek(2) object WEDNESDAY extends DayOfWeek(3) object THURSDAY exte

我已经看过了,但它似乎太多的努力太少的好处

基本上,我希望有一个
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!"
我希望有一个trait(
MyEnum
),我可以将它与包含我的“枚举对象”的对象混合,并使用方法返回它们的列表(
def值:list[MonthDay]
)或迭代它们(
def next:MonthDay
def previous:MonthDay

PPS:按照Ken Bloom的要求。

已经完全满足了您的需求

我想你可能会被Scala2.7和Scala2.8弄糊涂了。你提到的老问题是在Scala 2.7时代写的,虽然我不能去测试Scala 2.7的
枚举
s有什么功能,但Scala 2.8的
枚举
肯定拥有你想要的一切


您不能使用
对象值(1)
定义值,因为
对象
是惰性初始化的。

我能想到的最接近的值是:

abstract class MyEnum(val displayName:String){
   protected object Value{
      var _values:List[Value] = Nil
      def values = _values
   }
   protected class Value (val value:Int){
      Value._values = this::Value._values
      override def toString = "%s(%d)".format(displayName,value)
   }
   def values = Value.values
}

trait Methods{
   def dayName
}

object DayOfWeek extends MyEnum("DayOfWeek"){
   val SUNDAY = new Value(1) with Methods{
      override def dayName = "Sunday"
   }
   val MONDAY = new Value(2) with Methods{
      override def dayName = "Monday"
   }
   val TUESDAY = new Value(3) with Methods{
      override def dayName = "Tuesday"
   }
   val WEDNESDAY = new Value(4) with Methods{
      override def dayName = "Wednesday"
   }
   val THURSDAY = new Value(5) with Methods{
      override def dayName = "Thursday"
   }
   val FRIDAY = new Value(6) with Methods{
      override def dayName = "Friday"
   }
   val SATURDAY = new Value(7) with Methods{
      override def dayName = "Saturday"
   }
}

我还没有弄清楚如何更改
\u values
变量的类型,以使用方法捕获完整的类型

这个怎么样?它要求您为每个新值实际调用
add
方法,但
values
返回正确的类型

abstract class MyEnum{

   type Value     //define me to be the value type for this MyEnum

   private var _values:List[Value] = Nil
   def values = _values    
   protected def add(newValue:Value) = {
      _values = newValue::_values
      newValue
   }
}

object DayOfWeek extends MyEnum{
   class Value(val dayNum:Int)
   val SUNDAY    = add(new Value(1))
   val MONDAY    = add(new Value(2))
   val TUESDAY   = add(new Value(3))
   val WEDNESDAY = add(new Value(4))
   val THURSDAY  = add(new Value(5))
   val FRIDAY    = add(new Value(6))
   val SATURDAY  = add(new Value(7))
}
你现在可以打电话了

println(DayOfWeek.values map (_.dayNum))
如果需要在不同对象上具有不同方法定义的单例对象,可以创建如下匿名类:

add(new Value{
      override def dayNum=8
    })

没有。我查看了scala.Enumeration,但它不起作用。无法将方法添加到相应的类中。此外,该类的用户实例化实例与枚举中的
值不属于同一类型。请更正。我没有意识到目标是将用户定义的方法添加到
Value
类中。@soc我不明白为什么您认为无法从枚举向Val添加方法。请参阅在这个答案中的模式C,我刚刚发布到另一个线程(并考虑您可以添加任何方法)来扩展VAL的CASE类CHESSPECAVE:作为一个侧重点,您希望在内部使用<代码> >列表[Value] /代码>内部的代码,而不是<代码> Value>代码>类型<代码>数组[Value]
,因为您希望返回给用户的值列表是完全不可变的。是否可以将修改后的问题作为新问题(措辞为反思问题)重新提问?它实际上与枚举无关。我提出的
add
函数仍然是解决您修改后的问题的可行方法。@Ken Bloom:完成,它在这里: