scala中的sealed
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相关推荐
- scala中的match详解
Scala中提供了比java,c更加强大的switch语句--match,而且不用担心因为忘记写break语句而发生case穿透 1.更好的switch 与if,类似match也是表达式,如下一个用于 ...
- Scala中Unit、Nothing和Null之间的区别概述
在Scala中,Unit.Nothing和Null是三个比较特殊的数据类型,三者之间的区别如下: Unit 类似于Java中的void,表示没有返回值,用于不返回任何结果的方法的结果类型. 只有一个实 ...
- Akka 系列(五):Java 和 Scala 中的 Future
随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue,带你走入异步编程的 ...
- scala 中List的简单使用
/*** scala 中List的使用**/object ListUse {def main(args: Array[String]): Unit = {def decorator(l:List[In ...
- Scala中没有break和continue, 如何退出循环
Java是指令式风格,Scala是函数式风格. 在Scala中,应该尽量适用循环,而是应用函数的方式来处理. Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办 ...
- Scala中Manifest、ClassTag、TypeTag的学习
2019独角兽企业重金招聘Python工程师标准>>> Manifest介绍 Manifest是scala2.8引入的一个特质,用于编译器在运行时也能获取泛型类型的信息. 在JVM上 ...
- Scala中集合类型与java中集合类型转换
对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...
- Scala 中的函数式编程基础(一)
主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...
- akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...
Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...
最新文章
- JAVA必备——13个核心规范
- python elasticsearch
- RabbitMQ(二)工作队列
- 在VS2005下使用libjson -- wangj
- JAVA.Properties了解一下
- richTextBoxFontClass
- git/github使用完整教程(2)分支
- java后台面试题整理
- 浏览计算机已查找驱动程序软件,欢迎访问海南省数字证书认证中心
- JavaFX屏幕截图工具ScreenCapture
- android 高仿国美,iOS高仿国美、二次元应用、点赞喷射动画、电影筛选页等源码...
- React.js基础知识总结一
- dns服务器地址为空,dns服务器地址为空
- Python深度学习笔记04——tensorflow实现神经网络(壹)
- 使用win7自带的备份还原、创建系统镜像
- office实操技能01:修改微软Office页面的(非背景的)浅绿底色、设置默认字体和主题颜色、取消页眉横线、PPT默认的等线字体
- C# 获取汉字的拼音首字母(转)
- IBM InfoSphere Guardium的大数据安全性和审计
- 第5章第27节:如何录制幻灯片的演示过程 [PowerPoint精美幻灯片实战教程]
- python json文件对比方法