กำหนดตัวสร้างเริ่มต้นสำหรับการบันทึก


20

ฉันมีบันทึกและต้องการเพิ่มตัวสร้างเริ่มต้นให้กับมัน

public record Record(int recordId) {
   public Record{

   }
}

แต่มันสร้างตัวสร้างด้วยพารามิเตอร์ภายใน

public final class Record extends java.lang.Record{
    private final int recordId;
    public Record(int);
    //other method
}

เราจะเพิ่มนวกรรมิกเริ่มต้นในบันทึกได้อย่างไร?


สิ่งที่คุณกำหนดเป็นตัวสร้างขนาดกะทัดรัดที่ได้รับการประกาศมาจากส่วนหัวของบันทึก มี 1-1 การจับคู่ในชื่อประเภทและความแปรปรวนของตัวแปรระหว่างองค์ประกอบบันทึกและพารามิเตอร์ที่เป็นทางการที่สอดคล้องกันในตัวสร้างขนาดกะทัดรัดเดียวกันใช้สำหรับตัวสร้างแบบบัญญัติ ระเบียนสามารถมีตัวสร้างแบบบัญญัติเท่านั้น หากประกาศตัวสร้างแบบกะทัดรัดเป็นตัวสร้างแบบบัญญัติ
Vicente Romero

คำตอบ:


18

ในการแยกเส้นผมคุณไม่สามารถกำหนด constructor เริ่มต้นได้เนื่องจาก constructor เริ่มต้นถูกสร้างขึ้นโดยคอมไพเลอร์เมื่อไม่มีการกำหนด constructors ดังนั้น Constructor ที่กำหนดไว้จึงเป็นนิยามที่ไม่ใช่ค่าเริ่มต้น

ถ้าคุณต้องการให้เร็กคอร์ดมีตัวสร้างแบบไม่มีอาร์กิวเมนต์เร็กคอร์ดอนุญาตให้เพิ่มตัวสร้างพิเศษหรือวิธีการของโรงงานตราบใดที่ "ตัวสร้างแบบบัญญัติ" ซึ่งใช้ฟิลด์บันทึกทั้งหมดเมื่อมีการเรียกอาร์กิวเมนต์

public record Record(int recordId) {
   public Record() {
      this(0); 
   }
}

17

คอนสตรัคที่ชัดเจน

ในกรณีของคุณคุณสามารถระบุคอนสตรัคเตอร์แบบไม่มีอาร์กิวเมนต์ด้วยการมอบสิทธิ์ให้คอนสตรัคเตอร์แบบบัญญัติด้วยค่าเริ่มต้นหากคุณต้องการและสามารถทำสิ่งนี้เป็น -

public Record(){
    this(Integer.MIN_VALUE);
}

กล่าวสั้น ๆ คอนสตรัคเตอร์ที่ไม่เป็นที่ยอมรับใด ๆ ควรมอบอำนาจให้ผู้อื่นและนั่นควรจะเป็นจริงสำหรับลักษณะการแบกรับข้อมูลของการเป็นตัวแทนเหล่านี้

ตัวสร้างขนาดกะทัดรัด

โปรดทราบว่าการเป็นตัวแทนที่คุณใช้ในรหัสของคุณ

public Record {}

ถูกเรียกว่าเป็น "ตัวสร้างแบบย่อ" ซึ่งหมายถึงตัวสร้างที่ยอมรับอาร์กิวเมนต์ทั้งหมดและยังสามารถใช้สำหรับการตรวจสอบความถูกต้องของข้อมูลที่ให้ไว้เป็นแอตทริบิวต์ของเรกคอร์ด Constructor ที่กะทัดรัดเป็นทางเลือกหนึ่งในการประกาศ Constructor แบบบัญญัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.