拥抱现代Java:记录与密封类的实用指南
如果你对Java的印象还停留在冗长的getter/setter和匿名内部类,那么你错过了很多精彩。现代Java(特别是LTS版本如Java 17、21)引入了众多提升开发体验和代码质量的新特性。今天,我们来探讨两个改变游戏规则的特性:记录(Record)和密封类(Sealed Class)。
1. 记录:不可变数据的透明载体
我们常常需要创建一个类,仅仅是为了承载数据,如DTO或数据库查询结果。传统的Java类需要编写大量模板代码:字段、构造器、getter、equals()、hashCode()和toString()。
记录类让这一切变得极其简洁:
public record User(String name, String email) {
}
一行代码!编译器会自动为我们生成:
- 所有字段的
final引用。 - 一个规范的构造器。
- 所有字段的访问器(
name(),email())。 equals()、hashCode()和toString()方法。
记录是不可变的,这天然适用于函数式编程和多线程环境,确保了数据状态的安全。
2. 密封类:受控的继承层次
传统的类继承是开放的,任何人都可以继承一个public class。这可能导致不可控的扩展和脆弱的设计。密封类通过明确规定哪些类可以继承它,来解决这个问题。
public sealed interface Shape permits Circle, Rectangle, Triangle {
double area();
}
public final class Circle implements Shape {
/* ... */ }
public non-sealed class Rectangle implements Shape {
/* ... */ }
public final class Triangle implements Shape {
/* ... */ }
通过sealed关键字和permits子句,我们精确控制了只有Circle、Rectangle和Triangle可以实现Shape接口。结合switch模式匹配,我们可以写出安全且优雅的代码:
// 预览特性,但代表了未来方向
double area = switch(shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.length() * r.width();
// 无需default,因为所有情况已枚举!
};
结语
记录和密封类共同协作,让我们能以更声明式、更安全的方式来建模数据和处理逻辑。它们减少了模板代码,增强了编译时检查,并使得代码意图更加清晰。是时候升级你的JDK,将这些现代特性融入到你的项目中了!