关于java:详解-Java-17-中新推出的密封类

31次阅读

共计 2075 个字符,预计需要花费 6 分钟才能阅读完成。

Java 17 推出的新个性 Sealed Classes 经验了 2 个 Preview 版本(JDK 15 中的 JEP 360、JDK 16 中的 JEP 397),最终定稿于 JDK 17 中的 JEP 409。Sealed Classes 有两种支流翻译:密封类、关闭类。集体喜爱前者多一些,所以在本文中都称为密封类。其实 Sealed Classes 的其余许多语言中并不是什么陈腐事物,C#、Scala 等高级语言中都有相似的名称,但意义和作用各不相同。上面就来一起认识一下 Java 17 中的 Sealed Classes。

密封类的作用

在面向对象语言中,咱们能够通过继承(extend)来实现类的能力复用、扩大与加强。但有的时候,有些能力咱们不心愿被继承了去做一些不可预知的扩大。所以,咱们须要对继承关系有一些限度的管制伎俩。而密封类的作用就是 限度类的继承

已有的限度伎俩

对于继承能力的管制,Java 很早就曾经有一些了,次要是这两种形式:

  1. final润饰类,这样类就无奈被继承了
  2. package-private类(非 public 类),能够管制只能被同一个包下的类继承

但很显然,这两种限度形式的粒度都十分粗,如果有更精细化的限度需要的话,是很难实现的。

新个性:密封类

为了进一步加强限度能力,Java 17 中的密封类减少了几个重要关键词:

  • sealed:润饰类 / 接口,用来形容这个类 / 接口为密封类 / 接口
  • non-sealed:润饰类 / 接口,用来形容这个类 / 接口为非密封类 / 接口
  • permits:用在 extendsimplements之后,指定能够继承或实现的类

上面咱们通过一个例子来了解这几个关键词的用法,更多 Java 新个性,欢送关注 Java 前沿专栏,文档模式看 Java 新个性,浏览学习体验更佳,继续更新,珍藏保留!

假如咱们要设计一个游戏,这个游戏给用户抉择的英雄品种分为三大类:

  • 坦克
  • 输入
  • 辅助

每个品种下又有各种不同的具体英雄。所以,从咱们传统的面向设计思路,会这样来创立:

// 英雄基类
public class Hero {

}

// 坦克英雄的形象
public class TankHero extends Hero {

}

// 输入英雄的形象
public class AttackHero extends Hero {

}

// 辅助英雄的形象
public class SupportHero extends Hero {

}

// 坦克英雄:阿利斯塔
public class Alistar extends TankHero {

}

// 输入英雄:伊泽瑞尔
public class Ezreal extends AttackHero {

}

// 辅助英雄:索拉卡
public class Soraka extends SupportHero {}

整体构造有三层,具体如下图所示:

  • 第一层:Hero 是所有英雄的基类,定义英雄的根底属性
  • 第二层:按英雄的分类的三个不同形象,定义同类英雄的公共属性
  • 第三层:具体英雄的定义

这个时候,为了防止开发人员在创立新英雄的时候,搞乱这样的三层构造。就能够通过引入密封类的个性来做限度。

假如咱们心愿第一、第二层是稳固的,对于第二层英雄品种的形象不容许再减少,此时咱们就能够这样写:

public sealed class Hero permits TankHero, AttackHero, SupportHero {}

通过 sealed 关键词和 permitspermits 要害来定义 Hero 是一个须要密封的类,并且它的子类只容许为 TankHero, AttackHero, SupportHero 这三个。

实现这个革新之后,咱们会发现 TankHero, AttackHero, SupportHero 这三个类开始报错了,具体谬误如下:

sealed, non-sealed or final modifiers expected

这是因为父类 Hero 被 sealed 润饰之后,sealed的密封要求被传递过去,此时子类就必须在 sealednon-sealedfinal 之间抉择一个定义,它们别离代表:

  • sealed:持续连续密封类个性,能够持续指定继承的类,并传递密封定义给子类
  • non-sealed:申明这个类为非密封类,能够被任意继承
  • final:不容许继承

依据下面的假如需要,第一、第二层稳固,容许第三层具体英雄角色能够前期一直减少新英雄,所以三类形象英雄的定义能够这样编写:

public non-sealed class TankHero extends Hero {}

而对于第三层的英雄角色,曾经是最初的具体实现,则能够应用 final 定义来阻断后续的继承关系,比方这样:

public final class Ezreal extends AttackHero {}

通过这样的设置,这三层英雄的构造中第一第二层就失去了比拟好的爱护。

好了,明天的分享就到这里!如果您学习过程中如遇艰难?能够退出咱们超高品质的技术交换群,参加交换与探讨,更好的学习与提高!另外,不要走开,关注我!继续更新 Java 新个性专栏,文档模式看 Java 新个性,浏览学习体验更佳!

欢送关注我的公众号:程序猿 DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源

正文完
 0