加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala和java枚举之间的差异

发布时间:2020-12-16 18:43:03 所属栏目:安全 来源:网络整理
导读:我读了 an answer on SO where someone said that scala enumerations are useless,如果你真的需要,你应该使用java枚举. 虽然我之前使用过java枚举,但我不能说我完全理解它们,因为我在日常工作中不用java编码. 有人可以解释scala和java枚举之间的区别,以及sc
我读了 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中)更容易迭代.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读