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

Scala中的案例对象与枚举

蔺山
2023-03-14
问题内容

是否有关于何时使用案例类(或案例对象)与扩展Scala中的枚举的最佳实践指南?

他们似乎提供了一些相同的好处。


问题答案:

最大的不同是Enumerations支持从某些nameString实例化它们。例如:

object Currency extends Enumeration {
   val GBP = Value("GBP")
   val EUR = Value("EUR") //etc.
} 

然后,您可以执行以下操作:

val ccy = Currency.withName("EUR")

当希望保留枚举(例如,到数据库)或根据文件中的数据创建枚举时,此功能很有用。但是,我发现总体上来说,枚举在Scala中有点笨拙,并且具有附加组件的尴尬感,因此我现在倾向于使用case objects。Acase object比枚举更灵活:

sealed trait Currency { def name: String }
case object EUR extends Currency { val name = "EUR" } //etc.

case class UnknownCurrency(name: String) extends Currency

所以现在我的优势是…

trade.ccy match {
  case EUR                   =>
  case UnknownCurrency(code) =>
}

正如@ chaotic3quilibrium指出的(为了便于阅读而进行了一些更正):

关于“ UnknownCurrency(code)”模式,除了“破坏”该Currency类型的封闭集性质外,还有其他方法可以解决找不到货币代码字符串的问题。UnknownCurrency类型Currency现在可以潜入API的其他部分。

最好将这种情况推到外面,Enumeration并让客户处理Option[Currency]明显表明确实存在匹配问题的类型,并“鼓励” API用户自行解决。

为了在此遵循其他答案,case objects over Enumerations的主要缺点是:

  1. 无法迭代“枚举”的所有实例。确实是这种情况,但是在实践中我发现极少需要这样做。

  2. 无法从持久值中轻松实例化。这也是正确的,但是,除非使用大量枚举(例如,所有货币),否则这不会带来巨大的开销。



 类似资料:
  • 问题内容: 我试图将一些Scala代码注入到现有的Java应用程序中。(所以,话说回来,我想要更多的乐趣)。 我在Scala中创建一个单例的东西 现在,在OldJava.java中 我应该填写什么以便Java调用showMyPower方法?我尝试了两者 ,但没有任何效果。 (使用Jad反编译类文件,除了胡说八道之外,什么都没给我显示。) 编辑 我删除了声明,scala产生了预期的静态方法。(呼吁工

  • 问题内容: 我定义了一些案例类,如下所示: 我也有一个用Scalatra定义的端点: 我想要这个JSON对象: 反序列化为的适当实例。我正在努力弄清楚如何为其编写自定义反序列化器并将其注册到JSON4S。 问题答案: 您需要编写如下的序列化器: 序列化器 : 现在,您将不得不将此序列化器添加为默认格式。 希望这能解决您的问题。

  • 问题内容: 您将如何在PySpark中使用和/或实现等效的案例类? 问题答案: 正如Alex Hall[所提到的,命名产品类型的真实等效项是。 与在其他答案中建议的不同,它具有许多有用的属性: 具有明确定义的形状,可以可靠地用于结构模式匹配: FooBar = namedtuple(“FooBar”, [“foo”, “bar”]) foobar = FooBar(42, -42) foo, ba

  • 本文向大家介绍举例说明JavaScript中的实例对象与原型对象,包括了举例说明JavaScript中的实例对象与原型对象的使用技巧和注意事项,需要的朋友参考一下 首先声明:javascript中每个对象都有一个constructor属性和一个prototype属性。constructor指向对象的构造函数,prototype指向使用构造函数创建的对象实例的原型对象。 在这段代码中会报错,sayN

  • 我试图模拟Scala单例对象。特别是,我需要模拟对象在服务组件(测试中的类)中使用。使用Mockito这是不可能的,测试执行会以以下方式失败: 在这里阅读,Scalamock似乎允许这样做: 要模拟独立的单例对象,请使用。 我的服务组件是这样的: 我的build.sbt有所有这些依赖关系: 但是我找不到这个: 也许这也可以使用EasyMock和PowerMock实现,但我找不到任何Scala示例代

  • 我有这个Java接口 如何重写此方法?我试过: