栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Scala中的案例对象与枚举

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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(pre) =>}

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

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

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

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

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451652.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号