JEP 447: Statements before super(...) (Preview) 总结
主要观点
JEP 447 是 Java 22 中引入的一项预览特性,旨在允许在构造函数中的 super() 调用之前放置不引用正在创建的实例的语句。这一变更提高了构造函数的表达能力和可读性,同时保留了构造函数的安全性和初始化保证。
关键信息
- 背景:传统上,Java 构造函数要求任何显式的构造函数调用必须作为第一条语句。这一限制确保了自上而下的执行顺序,并防止访问未初始化的字段,但也限制了构造函数的灵活性和可读性。
- 变更内容:JEP 447 放宽了这一限制,允许在
super()调用之前放置不引用实例的语句。这使得开发者可以在调用父类构造函数之前进行参数验证或准备。 - 实现细节:该提案不需要对 Java 虚拟机 (JVM) 进行任何更改,完全依赖 JVM 现有的能力来验证和执行
super()调用之前的代码。
重要细节
示例改进:
原始代码:
public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { super(value); // 可能不必要的操作 if (value <= 0) throw new IllegalArgumentException("non-positive value"); } }改进后代码:
public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); super(value); } }- 解释:改进后的代码在调用父类构造函数之前进行参数验证,避免了不必要的操作。
参数准备示例:
原始代码:
public class SubClass extends SuperClass { public SubClass(Certificate certificate) { super(prepareByteArray(certificate)); } private static byte[] prepareByteArray(Certificate certificate) { // 从证书中准备字节数组的逻辑 return byteArray; } }改进后代码:
public class SubClass extends SuperClass { public SubClass(Certificate certificate) { PublicKey publicKey = certificate.getPublicKey(); if (publicKey == null) { throw new IllegalArgumentException("Null certificate"); } byte[] byteArray = switch (publicKey) { case RSAPublicKey rsaKey -> rsaKey.getEncoded(); case DSAPublicKey dsaKey -> dsaKey.getEncoded(); default -> throw new UnsupportedOperationException("Unsupported key type"); }; super(byteArray); } }- 解释:改进后的代码直接在构造函数中处理证书对象,减少了辅助方法的使用,提高了代码的直观性和可维护性。
结论
JEP 447 通过允许在 super() 调用之前放置不引用实例的语句,显著提高了 Java 构造函数的灵活性和可读性。这一变更在保持 Java 核心原则的同时,适应了现代编程实践的需求,为开发者提供了更高效的编码方式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。