ใน 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
- องค์ประกอบของบันทึกถือเป็นที่สิ้นสุดโดยปริยาย
นั่นคือทั้งหมดสำหรับวันนี้ ขอบคุณสำหรับการอ่านบทความนี้ กรุณาแสดงความคิดเห็นสำหรับข้อเสนอแนะและข้อเสนอแนะ