当前位置: 首页 > 面试题库 >

将Singleton对象作为枚举元素的Scala枚举,是否有可能对其进行迭代?

顾永福
2023-03-14
问题内容

我已经看过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: MonthDaydef 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中的列类型错误。找到:枚举,预期:整数 为什么是这样?这就像我用