scala和java枚举之间的差异
我读了
an answer on SO where someone said that scala enumerations are useless,如果你真的需要,你应该使用java枚举.
虽然我之前使用过java枚举,但我不能说我完全理解它们,因为我在日常工作中不用java编码. 有人可以解释scala和java枚举之间的区别,以及scala枚举中的缺点究竟在哪里? 解决方法
Scala枚举的主要缺点是难以向它们添加方法和字段.在Java中,将枚举用作具有固定数量实例的类是非常简单的(例如,为什么它们是实现单例的好选择).
然而,在Scala中,Enums只是一组可能的值;向它们添加方法和字段是一个更加hacky的过程.因此,如果你想要从枚举中获得超出微不足道的行为,Java枚举是一个更方便的工具. 例如,Java枚举可能如下所示: public enum Month{ january(31),february(28),... december(31); public final int daysInMonth; Month(int daysInMonth){ this.daysInMonth = daysInMonth; } } 但是,您必须这样做: object Month extends Enumeration{ protected case class Val(val daysInMonth:Integer) extends super.Val{} implicit def valueToMonth(x:Value) = x.asInstanceOf[Val] val january = Val(31) val february = Val(28) .... } 这在一个像这样的简单示例中看起来并不坏,但它确实添加了一些令人困惑的语法,并增加了另一个类的开销,需要隐式转换为enum的大多数用法. 我看到Java枚举的主要优点是你写的正是你的意思;一个枚举,上面有一些方法和字段.在斯卡拉,你写的不是你的意思;你需要创建一个枚举,它包含一个具有你想要的方法和字段的类,并且还定义了从该类到枚举的转换.表达同样的想法是一种不那么惯用的方式. 正如in the comments所指出的那样,Scala确实提供了Case Classes,在许多情况下它可以用作枚举的替代品,并且具有更清晰的语法.但是在某些情况下,Case Classes还不够(例如当你想迭代所有值时),所以常规枚举仍然有它们的位置.更正:使用宏确实可以迭代Case Classes,但这样做有其自身增加的复杂性,而枚举(在Scala和Java中)更容易迭代. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Dockerfile 中的 CMD 与 ENTRYPOINT
- 努力解析(bash)时间命令
- 什么是“反射式访问结构型成员方法应该启用…”警告意味着在
- angular broadcast emit 事件触发与事件广播
- GO语言学习笔记(一)一些基础常识以及实现生成随机密码小程
- bash – 使用Unix / Linux中的命令行来跟踪时间的日期和时间
- 在大数据集上使用多个过滤器的angularjs-ng-repeat
- 使用Angular 2在ngFor中的ngModel中设置动态属性
- angular.element vs document.getElementById或jQuery选择器
- 单元测试 – 如何让content_shell运行我的测试?