JEP 447: 优化Java构造函数以增强灵活性

JEP 447: Statements before super(...) (Preview) 总结

主要观点

JEP 447 是 Java 22 中引入的一项预览特性,旨在允许在构造函数中的 super() 调用之前放置不引用正在创建的实例的语句。这一变更提高了构造函数的表达能力和可读性,同时保留了构造函数的安全性和初始化保证。

关键信息

  1. 背景:传统上,Java 构造函数要求任何显式的构造函数调用必须作为第一条语句。这一限制确保了自上而下的执行顺序,并防止访问未初始化的字段,但也限制了构造函数的灵活性和可读性。
  2. 变更内容:JEP 447 放宽了这一限制,允许在 super() 调用之前放置不引用实例的语句。这使得开发者可以在调用父类构造函数之前进行参数验证或准备。
  3. 实现细节:该提案不需要对 Java 虚拟机 (JVM) 进行任何更改,完全依赖 JVM 现有的能力来验证和执行 super() 调用之前的代码。

重要细节

  1. 示例改进

    • 原始代码

      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);
          }
      }
    • 解释:改进后的代码在调用父类构造函数之前进行参数验证,避免了不必要的操作。
  2. 参数准备示例

    • 原始代码

      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 核心原则的同时,适应了现代编程实践的需求,为开发者提供了更高效的编码方式。

阅读 43
0 条评论