sealed关键字在scala的集合和模式匹配上面应用较多,本篇文章说明sealed的使用场景以及为什么使用sealed。

A sealed class cannot have any new subclasses added except the ones in the same file.这是sealed关键字比较官方的解释,意思是只在同一个文件中的添加其子类,除此以外不能有任何的子类(区别于java中任何类都可以进行集成操作),从这一点可以看出,其主要作用是用于设计上的,但是也有功能上的,下面从设计和功能两方面进行说明。

1. 防止滥用继承

sealed关键字可以修饰类和特质(特质)密封类提供了一种约束:不能在类定义的文件之外定义任何新的子类。这样可以防止继承的滥用,示例如下:

scala源码中List的实现用到了sealed关键字,抽象类List有sealed关键字修饰,在Nil::两个操作中,分别继承了该List的抽象类。当我们实现自己的list集合时,进行继承,将会出现错误。

抽象类List有sealed关键字修饰,接下来Nil和::分别继承了该List抽象类。那我们来尝试实现基于List实现一个自己的List:

scala> class NewList extends List
<console>:7: error: illegal inheritance from sealed class Listclass NewList extends List123

该类在编译的时候就不能通过,我们是不能在外部文件继承List类。所以,如果子类都明确的情况下,这是最为重要的前提,为了防止继承滥用,为抽象类添加sealed。(这一点主要是设计上的作用,在java语言中只有yes 和 no,在scala中提出更为重要的you should use it correctly rather than freely


2. 模式匹配校验子类

模式匹配是scala非常好用的一个语法特性。pattern使用的场景总结起来大约以下几类:

- Wildcard patterns // _ 统配
- Constant patterns // 常量
- Variable patterns // 变量
- Constructor patterns // 构造函数
- Sequence patterns // 比如List(,). 如果需要匹配剩余的话使用List(0,_*)
- Tuple patterns // (a,b,c)
- Typed patterns // 使用类型匹配 case a:Map[,]
- asInstanceOf[]
- isInstanceOf[]
- note(dirlt):这里需要注意容器类型擦除.Array例外因为这个是java内置类型

但是,当我们频繁改变条件,我们可能会忘了修改相应的case,那么这种情况就可能会出现错误。看下边例子:

scala> :pas
// Entering paste mode (ctrl-D to finish)abstract class Peoplecase object American extends Peoplecase object Japanese extends Peoplecase object Chinese extends Peoplecase object Russia extends Peopledef people(p: People) = p match {case American ⇒ println("American person")case Japanese ⇒ println("Japanese person")case Chinese ⇒ println("Chinese person")}// Exiting paste mode, now interpreting.defined class People
defined object American
defined object Japanese
defined object Chinese
defined object Russia
people: (p: People)Unitscala> people(American)
American personscala> people(Russia)
scala.MatchError: Russia (of class Russia$)at .people(<console>:13)... 33 elided12345678910111213141516171819202122232425262728293031

这时我们为People加上sealed,当我们编译代码时得到了一个警告:

<console>:18: warning: match may not be exhaustive.
It would fail on the following input: Russia

多温馨的一个提示啊。事情都不是绝对的,如果确定people只处理美国,日本,中国人,编译时总是给这么个警告也挺闹心。能破吗?可定能,看代码:

  def people(p: People) = (p: @unchecked) match {case American ⇒ println("American person")case Japanese ⇒ println("Japanese person")case Chinese ⇒ println("Chinese person")}

3. sealed总结

给我个人的感觉,这个关键字主要是在设计上的限制,更加规范你的代码,使你的代码更加的优雅,当然最后要对本文参考如下三篇博客,表示感谢!

https://blog.csdn.net/ZCF1002797280/article/details/50848487

https://www.cnblogs.com/rollenholt/p/4192758.html

https://yq.aliyun.com/articles/8611

scala中的sealed相关推荐

  1. scala中的match详解

    Scala中提供了比java,c更加强大的switch语句--match,而且不用担心因为忘记写break语句而发生case穿透 1.更好的switch 与if,类似match也是表达式,如下一个用于 ...

  2. Scala中Unit、Nothing和Null之间的区别概述

    在Scala中,Unit.Nothing和Null是三个比较特殊的数据类型,三者之间的区别如下: Unit 类似于Java中的void,表示没有返回值,用于不返回任何结果的方法的结果类型. 只有一个实 ...

  3. Akka 系列(五):Java 和 Scala 中的 Future

    随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue,带你走入异步编程的 ...

  4. scala 中List的简单使用

    /*** scala 中List的使用**/object ListUse {def main(args: Array[String]): Unit = {def decorator(l:List[In ...

  5. Scala中没有break和continue, 如何退出循环

    Java是指令式风格,Scala是函数式风格. 在Scala中,应该尽量适用循环,而是应用函数的方式来处理. Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办 ...

  6. Scala中Manifest、ClassTag、TypeTag的学习

    2019独角兽企业重金招聘Python工程师标准>>> Manifest介绍 Manifest是scala2.8引入的一个特质,用于编译器在运行时也能获取泛型类型的信息. 在JVM上 ...

  7. Scala中集合类型与java中集合类型转换

    对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...

  8. Scala 中的函数式编程基础(一)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  9. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

最新文章

  1. JAVA必备——13个核心规范
  2. python elasticsearch
  3. RabbitMQ(二)工作队列
  4. 在VS2005下使用libjson -- wangj
  5. JAVA.Properties了解一下
  6. richTextBoxFontClass
  7. git/github使用完整教程(2)分支
  8. java后台面试题整理
  9. 浏览计算机已查找驱动程序软件,欢迎访问海南省数字证书认证中心
  10. JavaFX屏幕截图工具ScreenCapture
  11. android 高仿国美,iOS高仿国美、二次元应用、点赞喷射动画、电影筛选页等源码...
  12. React.js基础知识总结一
  13. dns服务器地址为空,dns服务器地址为空
  14. Python深度学习笔记04——tensorflow实现神经网络(壹)
  15. 使用win7自带的备份还原、创建系统镜像
  16. office实操技能01:修改微软Office页面的(非背景的)浅绿底色、设置默认字体和主题颜色、取消页眉横线、PPT默认的等线字体
  17. C# 获取汉字的拼音首字母(转)
  18. IBM InfoSphere Guardium的大数据安全性和审计
  19. 第5章第27节:如何录制幻灯片的演示过程 [PowerPoint精美幻灯片实战教程]
  20. python json文件对比方法

热门文章

  1. 信号处理中的低通、高通和带通滤波器
  2. STM32实现低功耗待机总结(电流低至5.7uA)
  3. HC32F005 国产低功耗华大MCU芯片介绍
  4. 身份证最后一位的校验
  5. 非财务人员的财务培训教(一.二)------财务基础知识
  6. 归并排序原理及代码实现
  7. 【前端知识整理】边距塌陷问题 什么是BFC 如何阻止边距塌陷
  8. 七月:交通车辆管理、门禁考勤,智能化升级的最优方案你get到了吗?
  9. 音频之PCM与WAV
  10. JavaSE (9)