当前位置: 首页 > 后端技术 > Java

Java17新密封类

时间:2023-04-02 00:05:13 Java

详解Java17引入的新特性SealedClasses经历了2个Preview版本(JDK15中的JEP360,JDK16中的JEP397),最终在JDK17中定型JEP409.SealedClasses有两种主流译法:sealedclass和closedclass。我个人更喜欢前者,所以在本文中称之为密封类。事实上,SealedClasses在许多其他语言中并不是什么新鲜事物。C#、Scala等高级语言中也有类似的名字,但它们的含义和作用是不同的。我们来看看Java17中的SealedClasses。密封类的作用在面向对象语言中,我们可以通过继承(extend)来实现类的重用、扩展和增强。但有的时候,一些我们不想继承的能力做一些不可预知的扩展。因此,我们需要一种对继承关系进行一些限制的控制方法。密封类的作用是限制类的继承。Java中长期以来一直使用现有的限制方法来控制继承能力,主要有这两种方式:对类进行最终修改,使该类不能继承自package-private类(非public类),并且可以控制只能被同一个包下的类继承但是很明显,这两种限制方式的粒度是很粗的,如果有更细化的限制要求是很难实现的。新特性:sealedclass为了进一步增强限制能力,Java17中的sealedclass增加了几个重要的关键字:sealed:修饰类/接口,用来描述这个类/接口是一个sealedclass/interfacenon-sealed:修饰类/接口,用于描述该类/接口为非密封类/接口。下面通过一个例子来了解一下这些关键字的用法,更多Java新特性,欢迎关注Java前沿专栏,以文档的形式查看Java的新特性,更好的阅读学习体验,持续更新,收藏和节省!假设我们要设计一款游戏,将用户可以选择的英雄类型分为三类:坦克输出支持,每一类都有不同的具体英雄。所以,从我们传统的面向设计的思维,会这样创建://herobaseclasspublicclassHero{}//abstractpublicclassTankHeroextendsHero{}//abstractpublicclassAttackHeroextendsHero{}//abstractpublicclassSupportHeroextendsHero{}//坦克英雄:AlistarpublicclassAlistarextendsTankHero{}//输出英雄:EzrealpublicclassEzrealextendsAttackHero{}//辅助英雄:SorakapublicclassSorakaextendsSupportHero{}整体结构有三层,如下图所示:第一层:Hero是所有英雄的基类,定义了英雄的基本属性。第二层:根据英雄的分类进行三种不同的类型抽象,定义相似英雄的公共属性第三层:具体英雄的定义这时候为了防止开发者在使用的时候把这样的三层结构搞乱创造新的英雄。可以通过引入密封类的特性来限制。假设我们希望第一层和第二层保持稳定,第二层英雄类型的抽象不允许增加。这时候我们可以这样写:publicsealedclassHeropermitsTankHero,AttackHero,SupportHero{}通过sealed关键字和permitspermits键来定义Hero是一个需要密封的类,它的子类只允许成为TankHero、AttackHero和SupportHero。完成这个改造后,我们会发现TankHero、AttackHero、SupportHero这三个类开始报错。具体错误如下:sealed、non-sealedorfinalmodifiersexpected。这是因为父类Hero被sealed修饰后,sealed的密封要求被pass掉了,此时子类必须在sealed,non-sealed,final中选择一个定义,分别代表:sealed:continuetocontinuesealed类的特点,可以继续指定继承类,将sealed定义传递给子类non-sealed:声明该类为非密封类,可以任意继承final:不允许继承。根据上面的假设,第一层和第二层是稳定的,第三层允许后期不断增加新的英雄,所以三个类抽象英雄的定义可以这样写:publicnon-sealedclassTankHeroextendsHero{}而对于第三层的英雄角色,已经是最终的具体实现了,可以使用最终的定义来屏蔽后续的继承关系,比如这样:publicfinalclassEzrealextendsAttackHero{}通过这个设置,三层英雄结构的第一层和第二层得到了更好的保护。好了,今天的分享就到这里!如果你在学习过程中遇到困难?您可以加入我们超优质的技术交流群,参与交流讨论,更好的学习进步!还有,别走,跟我走!持续更新Java新特性专栏,以文档形式查看Java新特性,更好的阅读学习体验!欢迎来到我的公众号:程序员DD。第一时间了解行业前沿资讯,分享深度技术干货,获取优质学习资源