代码对比
✕ Java 8
class Square extends Shape {
Square(double side) {
super(side, side);
// can't validate BEFORE super!
if (side <= 0)
throw new IAE("bad");
}
}
✓ Java 25+
class Square extends Shape {
Square(double side) {
if (side <= 0)
throw new IAE("bad");
super(side, side);
}
}
发现此代码有问题? 告诉我们。
为什么现代方式更好
快速失败
在超类构造函数运行之前验证参数。
预先计算
在调用 super() 之前派生值并准备数据。
无变通方案
不再需要静态辅助方法或工厂模式来绕过该限制。
旧方式
在 super() 之后验证
现代方式
在 super() 之前编写代码
自 JDK
25
难度
中级
JDK 支持
灵活的构造函数体
可用
在 JDK 25 LTS 中正式发布(JEP 513,2025 年 9 月)。
工作原理
Java 25 解除了 super() 必须是第一条语句的限制。现在可以在超类构造函数运行之前验证参数、计算派生值并准备数据。
相关文档