ใน JDK-14 มีการแนะนำบันทึกคำหลักใหม่ บล็อกนี้เป็นความพยายามที่จะอธิบายการใช้คำหลักนี้ และวิธีที่จะช่วยให้โปรแกรมเมอร์ของเราเขียนโค้ดด้วยโค้ดสำเร็จรูปที่น้อยกว่าในบางกรณี

กรณีการใช้งาน:

สมมติว่าเราต้องสร้าง Employee คลาส Java ที่ไม่เปลี่ยนรูปใหม่ ซึ่งสามารถเก็บและส่งผ่านข้อมูลของเราได้ ตอนนี้เรารู้แล้วว่าในคลาสที่ไม่เปลี่ยนรูป ฟิลด์ควรเป็นที่สิ้นสุดและเป็นส่วนตัว ควรมีตัวสร้างอาร์กิวเมนต์สาธารณะทั้งหมด และควรมีเฉพาะ getters และไม่มี setters มันควรมี toString(), เท่ากับ() และ hashCode() วิธีการเช่นกัน

เมื่อคำนึงถึงข้อกำหนดข้างต้นแล้ว โค้ดของเราจะมีลักษณะดังนี้:

package org.example;

import java.util.Objects;

public class EmployeeNormal {

    private String name;
    private String lastName;

    public EmployeeNormal(String name, String lastName){
        this.name = name;
        this.lastName = lastName;
    }
    public String getName() {
        return name;
    }
    public String getLastName() {
        return lastName;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        EmployeeNormal that = (EmployeeNormal) o;
        return Objects.equals(name, that.name) && Objects.equals(lastName, that.lastName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, lastName);
    }

    @Override
    public String toString() {
        return "EmployeeNormal{" +
                "name='" + name + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}

ในตัวอย่างข้างต้น เราต้องเขียนทุกอย่างด้วยตัวเราเอง และสมมติว่าพรุ่งนี้ข้อกำหนดจะเปลี่ยนไป และเราจำเป็นต้องเพิ่มฟิลด์ใหม่ในคลาส Employee

ในการเพิ่มฟิลด์ใหม่ เราจะต้องเพิ่มฟิลด์นั้น จากนั้นอัปเดตวิธีการเป็นString(), เท่ากับ() และ hashCode() กระบวนการนี้ใช้เวลาเล็กน้อยและน่าเบื่อ

ดังนั้นเริ่มต้นด้วย JDK-14 Java ได้แนะนำบันทึกคำหลัก ซึ่งเราสามารถเขียนโค้ดด้านบนด้วยวิธีง่ายๆ

Like an enum, a record is a restricted form of a class. It’s ideal for "plain data carriers," classes that contain data not meant to be altered and only the most fundamental methods such as constructors and accessors.

ตัวอย่างโค้ดข้างต้นสามารถเขียนได้ง่ายๆ ดังนี้:

package org.example;

public record EmployeeRecord(String name, String lastName) {

}

แค่นั้นแหละ….!!!!

เราเพียงแค่ต้องใช้บันทึกคำหลักและเราได้สร้างคลาสที่ไม่เปลี่ยนรูปของเราแล้ว

บันทึกจะรับสมาชิกเหล่านี้โดยอัตโนมัติ:

  • ฟิลด์ final ส่วนตัวสำหรับแต่ละส่วนประกอบ
  • วิธีการเข้าถึงการอ่านสาธารณะสำหรับแต่ละองค์ประกอบที่มีชื่อและประเภทของส่วนประกอบเดียวกัน ในตัวอย่างนี้ วิธีการเหล่านี้คือ EmployeeRecord::name() และ EmployeeRecord::lastName()
  • ตัวสร้างสาธารณะซึ่งมีลายเซ็นมาจากรายการส่วนประกอบของเรกคอร์ด ตัวสร้างเริ่มต้นแต่ละฟิลด์ส่วนตัวจากอาร์กิวเมนต์ที่เกี่ยวข้อง
  • การใช้งานเมธอด equals() และ hashCode() ซึ่งระบุว่าสองเรคคอร์ดเท่ากันหากเป็นประเภทเดียวกันและส่วนประกอบเรคคอร์ดที่สอดคล้องกันเท่ากัน
  • การใช้งานเมธอด toString() ที่รวมการแสดงสตริงของส่วนประกอบทั้งหมดของเรกคอร์ดพร้อมชื่อ

รหัสไดรเวอร์สำหรับตัวอย่างข้างต้น:

package org.example;

public class Main {
    public static void main(String[] args) {


        EmployeeRecord emp = new EmployeeRecord("Himanshu", "Rai");

        System.out.println(emp.name());
        System.out.println(emp.lastName());
        System.out.println(emp.hashCode());
        System.out.println(emp.toString());
    }
}

หมายเหตุ: ต่างจาก getters() แบบดั้งเดิม ในบันทึก getterName ไม่ได้ขึ้นต้นด้วย get และคล้ายกับชื่อฟิลด์เท่านั้น มันจะไม่ใช่ emp.getName() แต่จะเป็น emp.name()

แต่มีข้อ จำกัด บางประการเช่นกันที่บันทึกไว้ดังต่อไปนี้:

  • บันทึกไม่สามารถขยายคลาสใดๆ ได้
  • บันทึกไม่สามารถเป็นนามธรรมได้ โดยปริยาย final
  • องค์ประกอบของบันทึกถือเป็นที่สิ้นสุดโดยปริยาย

นั่นคือทั้งหมดสำหรับวันนี้ ขอบคุณสำหรับการอ่านบทความนี้ กรุณาแสดงความคิดเห็นสำหรับข้อเสนอแนะและข้อเสนอแนะ

อย่าลืมกดติดตามถ้าชอบ!!