这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战。
下面是Java的另一个向kotlin看齐的特性:sealed class(密封类)。看名字的第一感觉它是一个受限制的类,是的,它只允许指定的类来继承。下面是简单的用法:
package com.example.geometry;
public abstract sealed class Shape
permits com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square { ... }
声明了密封类之后,需要指定哪些类允许继承,形成了小的组织,父类的代码只在这个几个类中可以使用。在原有的继承关系上做了一层限制,想要实现什么呢?有三点:
- 让类的作者可以精确的控制子类,保持不被滥用
- 扩展了原有的权限修饰符,限制父类的使用不再一刀切的开放或者私有
- 为未来的模式匹配打好基础,指定有限子类之后使模式匹配的分析更简单
其实第三点才是重点,就是为了switch模式匹配开发的,关于这点我们以后再分析。这个密封类从kotlin1.0的时代就有了,Java15才放出预览,直到2021.9的Java17才算正式面世,但Java做了接口的密封,随后kotlin才添加支持,算是青出于蓝吧。这个特性可以打个比方来描述一下:
原来公司只有10个人,其中一个是老板,创业公司还没有设置部门,大家都向这个老板汇报,做的事情都是老板指挥。这是没有密封类之前,可以随意的给父类添加子类。随着公司人员的不断扩张,老板的精力有限肯定没有时间什么事都事必躬亲,所以设置几个部门,任命几个部门的负责人,只要这几个负责人向我汇报每天公司的大小事务就行。这就是指定有权限继承的子类,老板对这几个负责人负责就是对全公司负责了。然后某个重点业务要做时,老板选择了其中一个团队,然后亲自管理,势必要成功。这个时候不必在全公司寻找合适的员工,因为这个团队之前已经建立,在招聘的时候招的就是专才。这就是模式匹配,我可以迅速的找到我需要的子类,节省了大量的分析成本。