密封案例类是一个好习惯吗?

2024-01-28

密封类的主要原因似乎是,这允许编译器在这些类上进行模式匹配时进行穷举搜索。假设我有用于模式匹配的数据类型。玩具示例:

sealed trait Statement
case class Assign(name: String, value: Int) extends Statement
case class Print(name: String) extends Statement
case class IfZero(name: String, thenn: Statement, els: Option[Statement]) extends Statement
case class Block(statements: List[Statement]) extends Statement

这些类的用例是通过模式匹配来使用它们:

def execute(statement: Statement): Unit = statement match {
    case Assign(name, value)      => ???
    case Print(name)              => ???
    case IfZero(name, thenn, els) => ???
    case Block(statements)        => statements foreach { execute(_) }
  }

为此,Statement特质是sealed这样,如果我忘记了匹配语句中的一种语句,编译器可以警告我。但是案例类呢?案例类不能相互继承,但特征和普通类可以。那么,密封案例类也是一个好的做法吗?如果我不这样做,会出现什么问题?


您不必密封案例类,但您应该将它们标记为final因此禁止任何进一步的继承关系。仅当您想要对其子类进行详尽检查时,将它们密封才有用,这不是一个很可能的用例。

将所有类标记为final默认情况下是一件好事,因为它禁止 API 用户在重写其方法时更改这些类的行为。如果您没有专门设计要子类化的类,则子类化可能会导致应用程序中出现错误,因为子类化的类不再执行其预期的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

密封案例类是一个好习惯吗? 的相关文章

随机推荐

  • 没有为 MySQLi 准备好的语句中的参数提供数据

    我一直在重新设计我的网站 从不受保护的 MySQL 查询到 mysqli 准备好的语句 一切都很顺利 直到我得到这个 没有为准备好的语句中的参数提供数据 if empty err pSETQuery NULL if empty POST p
  • 命名空间中的枚举

    做这样的事情有没有意义 namespace status enum status ok error 并像这样使用它status ok 或者我应该这样做 enum status status ok status error 并像这样使用它st
  • 添加到 ArrayList Java

    我是java初学者 需要一些帮助 我正在尝试将抽象数据类型 Foo 它是一个关联列表 转换为字符串 B 的 Arraylist 如何循环遍历该列表并将每个字符串添加到数组中 我可能想多了 但我现在迷失了 我在这里先向您的帮助表示感谢 实例化
  • deepcopy() 非常慢

    我在 Python 中有一个包含大约 1000 个对象 行星系统 恒星 行星 的游戏状态 我需要复制它并在需要时对其应用一堆转换 然而 在大约 1 个请求 秒的情况下 这是占用了我24 63 的运行时间 https i stack imgu
  • 如何列出属于某个VPC的所有资源?

    在我的 AWS 账户中 我的 VPC 很少 我正在尝试找到一种方法来列出位于某个 VPC 下的所有资源 谢谢 您可以通过三种方式完成此操作 AWS CLI AWS 控制台或代码 AWS CLI 您可以使用 AWS CLI 列出与 VPC 关
  • Slim 基本身份验证

    今天是个好日子 我这里有一个有效的精简代码slim basic auth https packagist org packages tuupola slim basic auth当我进入受限目录时 会显示以下内容 一切正常 但我想做的是将其
  • 使用 SqlDataReader 和字符串数组

    我想使用数据读取器读取记录并将结果发送到数组字符串 我使用存储过程从 2 个表中选择数据 string ReqID string ConnectionString ConfigurationManager ConnectionStrings
  • Extjs如何让滚动条出现?

    我需要在表单比包含容器更宽时立即显示滚动条 我在容器上设置了属性 autoScroll true 但它不起作用 有办法得到我需要的结果吗 这是工作示例 http jsfiddle net mQC3B 2 http jsfiddle net
  • 提高 SQL Server 中的 Xquery 性能

    我有一个 Azure SQL 数据库 其中有 1 个表和大量记录 超过 75 000 条 该表包含 XML 数据类型的列 此列如下所示
  • 如何使用maven使用PrimeFaces-5.2.X的jar?

    这个问题看起来很简单 但是根据我的研究 maven 存储库http repo maven apache org maven2 org primefaces primefaces http repo maven apache org mave
  • 为什么测试“NaN == NaN”对于从 pandas 数据帧中删除不起作用?

    请解释如何在 pandas 中处理 NaN 因为以下逻辑对我来说似乎 损坏 我尝试了各种方法 如下所示 来删除空值 我的数据框 我使用它从 CSV 文件加载read csv 有一个列comments 大部分时间都是空的 专栏marked r
  • Elasticsearch 的最大滚动时间

    滚动搜索可以设置的最大滚动时间是多少 文档 https www elastic co guide en elasticsearch client javascript api current api reference html api s
  • Qt 同时使用多种字体

    我想在我的软件中使用三种字体 FontA 包含拉丁文 希腊文 西里尔文字符 FontB 包含韩文字符 FontC 包含日文 汉字 这些字体没有重叠 我想设置我的应用程序 以便立即使用所有这些字体 因为来自不同语言的字符可能会出现在我的软件中
  • 解析数字 ifconfig 标志

    ifconfig 命令输出其以文本和数字格式 虽然我可以找到参考对于数字标志 我找不到任何有关如何解释 屏蔽 数字的指示 qfe2 flags 1100843
  • 线程1:EXC_BAD_ACCESS(代码=1地址=0x0)

    我正在尝试创建一个简单的洗牌和发牌模拟器 我使用一个向量来表示一副 52 张牌 每张牌都由结构表示BitCard其元素的空间是内存 受到位域的限制 但是当构造函数尝试访问向量时 xCode 会抛出一个BAD ACCESS exception
  • 错误:类型“_InternalLinkedHashMap ”不是类型转换中“List ”类型的子类型

    我是 Flutter 新手 我尝试从 10 0 2 2 8000 api members 上的 api 获取数据 但收到错误 例如类型列表动态不是类型 列表 的子类型 我正在遵循颤动的示例 https flutter dev docs co
  • 在数据库中存储用户变量与在asp.net中存储会话

    我正在使用一个 ASP NET 应用程序 该应用程序将大部分数据存储在数据库中而不是会话中 我想知道每种方法的优缺点以及哪种方法更好 例如 您有一个非常繁忙的站点 而不是在会话中存储用户特定变量 而是有一个称为用户数据的数据库表 它可以存储
  • 如何传递参数并将 stdin 从文件重定向到在 gdb 中运行的程序?

    我通常运行一个程序 a out arg1 arg2
  • 实体框架可以处理存储过程中的多个结果集(每个结果集来自连接表)吗?

    在 Linq to SQL 中 我找不到一种简单的方法来处理存储过程返回的多个结果集 其中每个结果集都来自表连接 每个结果集并不直接映射到表 无法改变这种行为 目前看来 使用 DataSet 似乎要简单得多 当前的实体框架或即将推出的实体框
  • 密封案例类是一个好习惯吗?

    密封类的主要原因似乎是 这允许编译器在这些类上进行模式匹配时进行穷举搜索 假设我有用于模式匹配的数据类型 玩具示例 sealed trait Statement case class Assign name String value Int