当前位置: 首页 > news >正文

Java 17 LTS-封闭类和封闭接口(Sealed Classes and Interfaces)

Java 17 是一款长期支持版本(LTS),引入了多个新特性,其中之一便是封闭类和封闭接口(Sealed Classes and Interfaces)。封闭类和接口为类层次结构的设计提供了更多的控制,使得开发者能够严格定义哪些类可以扩展或实现某个类或接口。

一、封闭类和封闭接口的概念

封闭类(Sealed Classes)和封闭接口(Sealed Interfaces)是指通过声明其子类或实现类的权限,限制哪些类可以继承该类或实现该接口。通过这种机制,类的继承结构可以得到更好的管理和控制,避免无约束的扩展。

1. 封闭类的基本特性

封闭类的设计目的是为了限制子类的数量,确保继承结构在设计时被精确定义。封闭类的子类可以是:

  • 最终类(final class):不允许进一步继承。
  • 封闭类(sealed class):子类本身也可以封闭,进一步限制其子类。
  • 非封闭类(non-sealed class):打破封闭性,允许任意继承。
2. 封闭接口的基本特性

封闭接口与封闭类的概念类似,它限制了哪些类可以实现该接口,确保接口的实现只能在特定的子类型中进行。

二、封闭类和接口的语法

Java 17 引入的 sealed 关键字用于声明一个封闭类或封闭接口。封闭类和接口必须显式地列出其允许的子类或实现类,使用 permits 关键字。

1. 封闭类的语法
public sealed class Shape permits Circle, Rectangle, Triangle {// 类的定义
}

在上面的例子中,Shape 是一个封闭类,它仅允许 CircleRectangleTriangle 作为其子类。这个类的继承结构受到了严格限制。

2. 封闭接口的语法
public sealed interface Vehicle permits Car, Truck, Bike {// 接口的方法
}

在这个例子中,Vehicle 是一个封闭接口,它只允许 CarTruckBike 来实现。

三、封闭类和接口的子类规则

对于封闭类或接口的子类,有以下几种选择:

  1. 最终类(final class):声明为最终类后,不能再被继承。

    public final class Circle extends Shape {// Circle 的实现
    }
    
  2. 封闭类(sealed class):子类本身可以继续封闭,限制其进一步的子类。

    public sealed class Rectangle extends Shape permits Square {// Rectangle 的实现
    }
    
  3. 非封闭类(non-sealed class):打破封闭,允许其他类自由继承。

    public non-sealed class Triangle extends Shape {// Triangle 的实现
    }
    

通过这些选择,开发者可以灵活定义继承层次的封闭性和开放性。

四、封闭类和接口的使用场景

封闭类和接口特别适合用于以下场景:

1. 枚举替代方案

在某些情况下,封闭类可以作为枚举的替代方案,特别是在需要定义一组类型,但这些类型需要包含额外的状态或行为时。例如,定义几何形状:

public sealed class Shape permits Circle, Rectangle, Triangle {public abstract double area();
}public final class Circle extends Shape {private final double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}public final class Rectangle extends Shape {private final double width, height;public Rectangle(double width, double height) {this.width = width;this.height = height;}@Overridepublic double area() {return width * height;}
}public non-sealed class Triangle extends Shape {private final double base, height;public Triangle(double base, double height) {this.base = base;this.height = height;}@Overridepublic double area() {return 0.5 * base * height;}
}

在这个例子中,Shape 是一个封闭类,只允许特定的子类定义几何形状。每种形状都实现了自己的 area() 方法,这类似于枚举的行为,但具有更大的灵活性。

2. 安全的继承设计

封闭类可以确保类的继承结构在设计时被控制和限制,这对框架开发者尤其有用。例如,当开发者不希望某个类被滥用或过度继承时,封闭类能提供明确的限制。

3. 强制类层次结构

在某些设计模式或领域建模中,封闭类可以确保类层次结构的完整性。例如,若一个应用只允许某些特定类型参与交易,那么可以通过封闭接口来限制实现类的范围。

五、封闭类和接口的优势

封闭类和接口提供了几个显著的优势:

  1. 增强的封装性:通过限制子类或实现类的数量和种类,封闭类和接口增强了类的封装性。开发者可以对类层次结构进行更多控制,避免不受控制的继承。

  2. 简化模式匹配:随着封闭类的引入,Java 还计划在未来版本中支持模式匹配(Pattern Matching)功能。封闭类的引入将使模式匹配更加简单和安全,因为编译器可以通过封闭类的定义得知所有可能的子类。

  3. 明确的类层次设计:封闭类让类层次设计更加明确。开发者可以在设计时定义好子类和实现类,确保继承的范围和规则得到遵守,避免意外扩展。

  4. 编译时检查:封闭类和接口的子类必须在同一个模块或包中定义,编译器可以确保所有的子类都在允许的范围内,并且不会有未定义的类被添加进来,从而提高了系统的安全性。

  5. 更好的代码维护:封闭类和接口能够减少继承结构中的不确定性,使代码的维护更加轻松。由于继承结构是设计时明确规定的,未来的维护人员可以清楚地知道类的继承层次,从而减少理解和修改代码的难度。

六、封闭类和接口的局限性

尽管封闭类和接口带来了很多优势,但它们并非没有局限性:

  1. 模块和包的限制:封闭类的所有子类必须与封闭类位于同一个模块或包中,这在某些场景下可能会造成设计上的限制,尤其是当需要跨模块进行扩展时。

  2. 灵活性降低:虽然封闭类能够增强控制力,但这也意味着灵活性的降低。如果以后需要引入新的子类或实现类,可能需要修改封闭类的声明。

  3. 复杂性:对于简单的类设计,引入封闭类可能会增加不必要的复杂性。因此,开发者需要在封闭类的使用中权衡其必要性。

七、总结

Java 17 引入的封闭类和封闭接口为面向对象设计提供了更多控制和安全性。通过限制子类和实现类,封闭类确保了类层次结构的明确性、继承的安全性以及代码的可维护性。这一功能尤其适合于需要控制继承关系、领域建模或复杂框架设计的场景。


http://www.mrgr.cn/news/26471.html

相关文章:

  • shell脚本语法
  • 华为OD机试 - 机器人仓库搬砖 - 二分查找(Java 2024 E卷 100分)
  • 关于Redis缓存一致性问题的优化和实践
  • 2020-10-26 c语言,一串用空格隔开的数字求和。
  • Java 21的Collections Framework的笔记
  • 3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
  • 探索使用 CockroachDB、Redpanda 和 Kafka Connect 将数据实时摄取到 Snowflake 中
  • 气膜体育馆:为学校打造智能化运动空间—轻空间
  • idea中java及java web项目的常见问题
  • CentOS 7官方源停服,配置本机光盘yum源
  • 3D GS 测试自己的数据
  • 系统架构设计师 - 项目管理
  • 华为OD机试 - 机器人仓库搬砖 - 二分查找(Python/JS/C/C++ 2024 D卷 100分)
  • 【数据结构】线段树复杂应用
  • Vue3实践-项目构造原理1
  • 『功能项目』事件中心【43】
  • Java中的服务发现机制:Eureka与Consul的比较
  • openCV的python频率域滤波
  • 2024122读书笔记|《人生歪理,歪的很有道理》——生活奇奇怪怪,你要可可爱爱
  • Velocity基本内容、语法、规则介绍