我已经看过Scala有关模拟Javaenum和case类与Enumeration的问题,但是似乎付出了太多的努力却却获得了太多的好处。
基本上,我希望有一个values
方法可以返回的所有单例html" target="_blank">对象,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
或def previous: MonthDay
)。
这个怎么样?它要求您实际上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
})
问题内容: 我有一个实现该接口的类,但是Java的foreach循环需要该接口。是否有一个到适配器在Java的标准库? 问题答案: 您需要一个所谓的“适配器”,以适应不兼容的。Apache commons- collections具有。用法是:
这很奇怪,我不知道该如何解释清楚。请耐心听我说,请查看代码片段以了解详细信息。 我使用枚举实现了一个单例。枚举有一个私有构造函数,在构造对象之前,我只在其中执行很少的操作和验证。对于所有这些验证,我将抛出一些异常(如IllegalArgumentException)。 我的测试用例包括针对负面和正面场景的测试。每当有两个以上的测试用例混合了负面和正面的测试用例时,我就会得到以下异常:。请检查下面的
问题内容: 是否有关于何时使用案例类(或案例对象)与扩展Scala中的枚举的最佳实践指南? 他们似乎提供了一些相同的好处。 问题答案: 最大的不同是Enumerations支持从某些nameString实例化它们。例如: 然后,您可以执行以下操作: 当希望保留枚举(例如,到数据库)或根据文件中的数据创建枚举时,此功能很有用。但是,我发现总体上来说,枚举在Scala中有点笨拙,并且具有附加组件的尴尬
问题内容: 我正在使用Java,我创建了一个枚举,如下所示: 上面的示例在以元素名称(即北美)使用空格时给出了错误。有什么建议可以解决上述问题吗? 问题答案: 您不能在标识符中间放置空格。 这样做结束了标识符,并且解析器假定接下来要执行的操作是该语句上下文中的有效令牌。很少(如果有)合法的地方。 常规的Java值名称为: 一个可以具有相关属性,如人类可读的名称,例如, 我对用于提供表示层表示形式有
可以枚举容器中的项目. Next 检索下一个项目或枚举中的项目. Enum.Next(OutputVar1 [, OutputVar2, ...]) OutputVar1, OutputVar2 接收特定于实现的值. ... 附加参数, 如果支持. 返回值 成功时返回非零整数, 如果没有剩余项目则返回零, 而参数不正确则返回空字符串. 对象 由 ObjNewEnum() 返回的计数器为每个键值对调
问题内容: 在我的MySQL数据库中,有“ gender enum(’male’,’female’)”列 我创建了枚举“ com.mydomain.myapp.enums.Gender”,并在我的实体中定义了“性别”。 现在,我想将枚举类型保留在我的MySQL数据库中,但是当我启动应用程序时,我得到: 性别列在MyApp.Person中的列类型错误。找到:枚举,预期:整数 为什么是这样?这就像我用