【问题标题】:With the new Java 14 Record functionality, is it possible of creating multiples constructors for the same Record?使用新的 Java 14 Record 功能,是否可以为同一个 Record 创建多个构造函数?
【发布时间】:2020-08-26 21:14:00
【问题描述】:

我有一堆使用 Lombok 的“数据”类,我想迁移所有这些类以使用 Java 14 中提供的新 Record 功能。使用新的 Java 14 Record 功能,是否可以为同样的记录?如果没有,是否有替代方案?

【问题讨论】:

    标签: java record


    【解决方案1】:

    在 Java 14 中,记录不能有多个构造函数(参考:Java 14 - JEP 359: Records (Preview))。

    从 Java 15 和 16+ 开始,记录可能有多个构造函数。 (见Java 15 - JEP 384: Records (Second Preview)Java 16 - JEP 395: Records (Final))。

    但是,每个构造函数必须委托给记录的规范构造函数,该构造函数可以显式定义或自动生成。

    一个例子:

    public record Person(
        String firstName,
        String lastName
    ) {
        // Compact canonical constructor:
        public Person {
            // Validations only; fields are assigned automatically.
            Objects.requireNonNull(firstName);
            Objects.requireNonNull(lastName);
    
            // An explicit fields assignment, like
            //   this.firstName = firstName;
            // would be a syntax error in compact-form canonical constructor
        }
    
        public Person(String lastName) {
            // Additional constructors MUST delegate to the canonical constructor,
            // either directly:
            this("John", lastName);
        }
    
        public Person() {
            // ... or indirectly:
            this("Doe");
        }
    }
    

    另一个例子:

    public record Person(
        String firstName,
        String lastName
    ) {
        // Canonical constructor isn't defined in code, 
        // so it is generated implicitly by the compiler.
    
        public Person(String lastName) {
            // Additional constructors still MUST delegate to the canonical constructor!
            // This works: 
            this("John", lastName);
    
            // (Re-)Assigning fields here directly would be a compiler error:
            // this.lastName = lastName; // ERROR: Variable 'lastName' might already have been assigned to
        }
    
        public Person() {
            // Delegates to Person(String), which in turn delegates to the canonical constructor: 
            this("Doe");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      相关资源
      最近更新 更多