ลอมบอกทะเยอทะยาน / setter vs Java 14 บันทึก


10

ฉันชอบโครงการลอมบอกแต่ในวันนี้ฉันกำลังอ่านและลองคุณสมบัติใหม่ของ java 14

ภายในความสามารถใหม่นี้มีคีย์เวิร์ดของเรกคอร์ดที่อนุญาตให้สร้างคลาสที่มีฟังก์ชันการทำงานต่อไปนี้แล้ว: คอนสตรัคเตอร์ฟิลด์สุดท้ายส่วนตัว accessors, equals / hashCode, getters, toString

ตอนนี้คำถามของฉันคือดีกว่าที่จะพึ่งพาคุณสมบัติของลอมบอกหรือเราควรเริ่มใช้ฟังก์ชั่นบันทึก:

ดีกว่าที่จะใช้สิ่งนี้:

record Person (String name, String surname) {}

หรือว่า:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

ข้อดีและข้อเสียของทั้งสองวิธีคืออะไร?


สำหรับสิ่งหนึ่งrecordจะไม่ทำงานกับสิ่งที่คาดหวังว่าตัวรับและตัวตั้งค่าสไตล์ JavaBeans
Mark Rotteveel

2
ความคิดเห็นของ Rotteveel หมายความว่าวิธีการเข้าถึงคุณสมบัติของระเบียนมีชื่อเดียวกันกับคุณสมบัติ ดังนั้นalice.phoneNumber()แทนที่จะประชุม JavaBeans ของ prefixing ด้วยในขณะที่get alice.getPhoneNumber()
Basil Bourque

1
recordคุณลักษณะเป็นคุณลักษณะแสดงตัวอย่าง , ยังไม่พร้อมสำหรับการใช้งานในการผลิต
Basil Bourque

เร็กคอร์ดมีข้อ จำกัด จำนวนมากเมื่อเทียบกับคลาส, เร็กคอร์ดไม่สามารถขยายเร็กคอร์ดหรือคลาสอื่น, ตรวจสอบส่วนข้อ จำกัด ใน JEP openjdk.java.net/jeps/359สำหรับรายละเอียดเพิ่มเติม
NAIT

คำตอบ:


9

ลอมบอกและrecordคุณสมบัติของภาษาจาวาเป็นเครื่องมือต่าง ๆ สำหรับสิ่งต่าง ๆ มีบางอย่างทับซ้อนกันตื้น ๆ แต่อย่าปล่อยให้สิ่งนั้นมารบกวนคุณ

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

บันทึกเป็นคุณสมบัติทางความหมาย พวกเขาจะtuples เล็กน้อย โดยการประกาศความหมายที่Point เป็น tuple ของ(int x, int y)คอมไพเลอร์สามารถได้รับการเป็นตัวแทนของมันเช่นเดียวกับการสร้างการประกาศความเท่าเทียมกัน hashing และโปรโตคอลการเป็นตัวแทนสตริงจากคำอธิบายของรัฐนี้ เนื่องจากมันมีซีแมนทิกส์ผู้อ่านและเฟรมเวิร์กจึงสามารถให้เหตุผลกับความมั่นใจที่สูงขึ้นเกี่ยวกับ API ของเร็กคอร์ด (สิ่งนี้อาจสะดวกกว่า syntactically ถ้าเป็นเช่นนั้นก็ดี)


1
+1 Brian Goetz: และนั่นคือสมมุติว่าคุณสามารถรับรุ่นลอมบอกปัจจุบันเป็นไอดีของคุณ ฉันสงสัยว่าลอมบอกมีข้อได้เปรียบที่มีความหมายใด ๆ เกี่ยวกับการอ่านโค้ดที่เร็วกว่านี้หรือไม่
Trunk

4

ฉันได้เล่นกับชุดนี้มาระยะหนึ่งแล้วและด้วยมือเล็กน้อยฉันสามารถเขียนความแตกต่างดังต่อไปนี้:

ลอมบอก

  • บันทึกยังไม่เป็นคุณสมบัติที่นำออกใช้และเป็นเพียงคุณสมบัติตัวอย่าง ดังนั้นการพักกับลอมบอกจึงสมเหตุสมผลมากกว่า
  • พวกเขายังไม่ได้เป็นเครื่องมือที่มีประสิทธิภาพในการกำจัดลอมบอกด้วยกัน โปรดทราบว่าห้องสมุดมีอื่น ๆ @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCodeอีกมากมายที่จะนำเสนอมากกว่าเพียงแค่
  • มีประสบการณ์ด้วยตนเองที่EqualsAndHashCodeไม่ได้เป็นเช่นเดียวกับที่คุณคาดหวังเมื่อมันมาถึงการโยกย้ายไปยังระเบียน

ประวัติ

  • ในบันทึกอื่น ๆ หากความต้องการของการเป็นตัวแทนวัตถุของคุณคือ "ผู้ให้บริการข้อมูล" คุณยังคงสามารถหาข้อได้เปรียบของ Records ได้โดยไม่ต้องพึ่งพาห้องสมุดเพิ่มเติมเพื่อลดรหัสสำเร็จรูปลง นั่นคือเหตุผลที่เป็นข้อสรุปบล็อกนี้อ่านต่อไปนี้:

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

แน่นอนว่าในแต่ละวันมันก็ฉลาดอยู่เสมอตามข้อกำหนดของโครงการที่จะเลือกวิธีที่จะติดตามและฝึกฝน


หมายเหตุ - ฉันจะพยายามอัปเดตข้อมูลนี้ให้มีตัวอย่างมากขึ้นเพื่อเป็นผู้ใช้ให้ใช้ทั้งคู่บ่อยครั้งในปัจจุบัน
Naman

3

หมายเหตุ: แทนที่จะเป็นต้นคริสต์มาสของคำอธิบายประกอบคุณสามารถใช้@Valueกับชั้นเรียนได้ โปรดทราบว่าสิ่งนี้จะทำให้ชั้นเรียนสุดท้ายและทำให้ทุกสาขาเป็นส่วนตัวและสุดท้ายและให้คุณได้พักผ่อนเช่นกัน นี่คือสิ่งที่ใกล้กับระเบียน (พวกเขาเป็นที่สิ้นสุดและเขตข้อมูลทั้งหมดภายในถือเป็นที่สิ้นสุด)

recordยังอยู่ในหน้าตัวอย่างดังนั้นสำหรับรหัสการผลิตแน่นอนว่ายังไม่เหมาะสม ใช้ลอมบอก

เมื่อบันทึกไม่ได้ดูมันจะซับซ้อนมากขึ้น ลอมบอกเป็นFARมีความยืดหยุ่นมากขึ้น คุณสามารถสลับในบางแง่มุมใหม่โดยไม่ต้องเขียนโค้ดใหม่ทั้งหมด (ตัวอย่างเช่นคุณสามารถเพิ่มส่วนคำสั่ง 'extends' ให้กับคลาสของคุณโดยไม่ต้องเขียนวิธีเท่ากับและ hashCode แล้วบันทึกสิ่งที่ไม่สามารถให้คุณได้) ลอมบอกยังมอบคุณสมบัติเพิ่มเติมให้กับคุณเช่นคุณสามารถเพิ่มตัวสร้างโดยการเพิ่ม@Builderคำอธิบายประกอบ บันทึกบางอย่างไม่สามารถทำได้

ถ้ามันไม่น่าเป็นไปได้อย่างยิ่งที่คุณจะใช้สิ่งนั้นกับชั้นเรียนที่คุณกำลังออกแบบ - ฉันจะใช้บันทึก

การปฏิเสธความรับผิด: ฉันเป็นผู้สนับสนุนหลักให้กับโครงการลอมบอก

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