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:完成,它在这里: