有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (1) 个答案

  1. # 1 楼答案

    在Java14中,记录不能有多个构造函数(引用: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");
        }
    }