案例对象与Scala中的枚举
bsint 发布于 2019-11-10 • 在 enumeration • 最后更新 2019-11-10 12:11 • 1933 浏览
是否有关于什么时候使用case classes(或case对象)和在Scala中扩展Enumeration的最佳实践指南? 他们似乎提供了一些相同的好处。
没有找到相关结果
已邀请:
bsint 发布于 2019-11-10 • 在 enumeration • 最后更新 2019-11-10 12:11 • 1933 浏览
是否有关于什么时候使用case classes(或case对象)和在Scala中扩展Enumeration的最佳实践指南? 他们似乎提供了一些相同的好处。
没有找到相关结果
13 个回复
verror
赞同来自:
如果您认真考虑维护与其他JVM语言(例如Java)的互操作性,那么最好的选择是编写Java枚举。这些工作透明地来自Scala和Java代码,这对于
scala.Enumeration
或案例对象来说更是如此。如果可以避免的话,我们就没有为GitHub上的每个新业余爱好项目创建一个新的枚举库!riure
赞同来自:
内容太长未翻译
uvero
赞同来自:
我在这里有一个很好的简单库,它允许你使用密封的特征/类作为枚举值,而不必维护自己的值列表。它依赖于一个不依赖于有缺陷的
knownDirectSubclasses
的简单宏。 https://github.com/lloydmeta/enumeratumet_et
赞同来自:
我更喜欢
case objects
(这是个人喜好的问题)。为了解决该方法固有的问题(解析字符串并迭代所有元素),我添加了一些不完美但有效的行。 我在这里粘贴代码,期望它可能有用,而且其他人可以改进它。xeos
赞同来自:
使用案例类而不是Enumerations的优点是:
iest
赞同来自:
一个很大的区别是
然后你可以这样做: 当希望持久化枚举(例如,到数据库)或从驻留在文件中的数据创建枚举时,这非常有用。但是,我发现一般来说,Scala中的枚举有点笨拙并且有一种笨拙的附加组件的感觉,所以我现在倾向于使用Enumeration
s支持从某些name
字符串中实例化它们。例如:case object
s。case object
比枚举更灵活: 所以现在我的优点是...... 正如@chaotic3quilibrium指出的那样(通过一些修正来简化阅读): 要在此处跟进其他答案,case object
s优于Enumeration
s的主要缺点是:pdolor
赞同来自:
当您需要在所有实例中进行迭代或过滤时,案例类与枚举的另一个缺点。这是Enumeration(以及Java枚举)的内置功能,而案例类不自动支持此类功能。 换句话说:“没有简单的方法来获取包含案例类的枚举值的总列表”。
kex
赞同来自:
对于那些仍在寻找如何获得GatesDa's answer to work的人: 您可以在声明它实例化之后引用case对象:
tut
赞同来自:
2017年3月更新:由Anthony Accioly评论,
scala.Enumeration/enum
PR已关闭。 Dotty(Scala的下一代编译器)将占据主导地位,尽管dotty issue 1970和Martin Odersky's PR 1958。注意:现在(2016年8月,6年以后)有关删除
scala.Enumeration
的提案:PR 5352nodit
赞同来自:
我已经看过各种版本的案例类模仿枚举。这是我的版本:
这允许您构建如下所示的案例类: 也许有人可以提出一个更好的技巧,而不是像我一样简单地将每个案例类添加到列表中。这就是我当时能想到的。jneque
赞同来自:
Case对象已经为其toString方法返回了它们的名称,因此不必单独传递它。这是一个类似于jho的版本(为简洁省略了便利方法):
物体是懒惰的;通过使用vals我们可以删除列表但必须重复名称: 如果您不介意作弊,可以使用反射API或Google Reflections等预先加载枚举值。非惰性案例对象为您提供最清晰的语法: 很好,干净,具有案例类和Java枚举的所有优点。就个人而言,我在对象之外定义枚举值以更好地匹配惯用的Scala代码:et_est
赞同来自:
更新:下面的代码有一个错误,描述为here。下面的测试程序可以工作,但是如果您在DayOfWeek本身之前使用DayOfWeek.Mon(例如),它将失败,因为DayOfWeek尚未初始化(使用内部对象不会导致外部对象被初始化)。如果您在主类中执行类似
val enums = Seq( DayOfWeek )
的操作,强制初始化枚举,或者您可以使用chaotic3quilibrium的修改,您仍然可以使用此代码。期待以宏观为基础的枚举!如果你想
dquis
赞同来自:
我最近几次需要它们时,我一直在这两个选项上来回走动。直到最近,我的偏好是密封的特征/案例对象选项。 1)Scala枚举声明
2)密封特征+案例对象 虽然这些都不能满足java枚举给你的所有内容,但下面是优点和缺点: Scala枚举 优点: - 用于实例化选项或直接假设准确的功能(从持久性存储加载时更容易) - 支持对所有可能值的迭代 缺点: - 不支持非穷举搜索的编译警告(使模式匹配不太理想) 案例对象/密封特征 优点: - 使用密封的特征,我们可以预先实例化一些值,而其他值可以在创建时注入 -full支持模式匹配(定义了apply / unapply方法) 缺点: - 从持久性存储中实例化 - 您通常必须在此处使用模式匹配或定义所有可能的“枚举值”的列表 最终让我改变观点的是以下片段:.get
调用是可怕的 - 使用枚举而不是我可以简单地在枚举上调用withName方法,如下所示: 因此,我认为我的偏好是在要从存储库访问值时使用Enumerations,否则使用case对象/密封traits。