POJO Class คืออะไร?

1. ภาพรวม

ในบทช่วยสอนสั้น ๆ นี้เราจะตรวจสอบคำจำกัดความของ "Plain Old Java Object"หรือ POJO สั้น ๆ

เราจะดูว่า POJO เปรียบเทียบกับ JavaBean อย่างไรและการเปลี่ยน POJO ของเราเป็น JavaBeans จะมีประโยชน์อย่างไร

2. วัตถุ Java เก่าธรรมดา

2.1. คืออะไรPOJO ?

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

มาสร้าง POJO ของพนักงานขั้นพื้นฐานกันเถอะ มันจะมีคุณสมบัติสามประการ ชื่อนามสกุลและวันที่เริ่มต้น:

public class EmployeePojo { public String firstName; public String lastName; private LocalDate startDate; public EmployeePojo(String firstName, String lastName, LocalDate startDate) { this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; } public String name() { return this.firstName + " " + this.lastName; } public LocalDate getStart() { return this.startDate; } }

คลาสนี้สามารถใช้ได้กับโปรแกรม Java ใด ๆ เนื่องจากไม่ได้เชื่อมโยงกับเฟรมเวิร์กใด ๆ

แต่เราไม่ได้ปฏิบัติตามแบบแผนที่แท้จริงใด ๆ สำหรับการสร้างเข้าถึงหรือแก้ไขสถานะของชั้นเรียน

การขาดการประชุมนี้ทำให้เกิดปัญหาสองประการ:

ขั้นแรกจะเป็นการเพิ่มเส้นโค้งการเรียนรู้สำหรับผู้เขียนโค้ดที่พยายามทำความเข้าใจวิธีใช้งาน

ประการที่สองอาจจำกัดความสามารถของเฟรมเวิร์กในการสนับสนุนการประชุมมากกว่าการกำหนดค่าเข้าใจวิธีใช้คลาสและเพิ่มฟังก์ชันการทำงาน

ในการสำรวจประเด็นที่สองนี้เรามาทำงานกับEmployeePojoโดยใช้การสะท้อน ดังนั้นเราจะเริ่มพบข้อ จำกัด บางประการ

2.2. การสะท้อนด้วย POJO

มาเพิ่มการพึ่งพาคอมมอนส์ - ถั่วลิสงในโครงการของเรา:

 commons-beanutils commons-beanutils 1.9.4 

ตอนนี้เรามาตรวจสอบคุณสมบัติของ POJO ของเรา:

List propertyNames = PropertyUtils.getPropertyDescriptors(EmployeePojo.class).stream() .map(PropertyDescriptor::getDisplayName) .collect(Collectors.toList());

ถ้าเราจะพิมพ์propertyNamesไปที่คอนโซลเราจะเห็นเฉพาะ:

[start] 

ที่นี่เราเห็นว่าเราได้รับการเริ่มต้นเป็นคุณสมบัติของชั้น PropertyUtilsไม่พบอีกสองรายการ

เราจะเห็นผลลัพธ์แบบเดียวกันคือเราใช้ไลบรารีอื่น ๆ เช่น Jackson เพื่อประมวลผลEmployeePojo

ตามหลักการแล้วเราจะเห็นคุณสมบัติทั้งหมดของเรา: firstName , lastNameและstartDate และข่าวดีก็คือไลบรารี Java จำนวนมากสนับสนุนสิ่งที่เรียกว่าหลักการตั้งชื่อ JavaBean โดยค่าเริ่มต้น

3. JavaBeans

3.1. คืออะไรJavaBean ?

JavaBean ยังคงเป็น POJO แต่แนะนำชุดกฎที่เข้มงวดเกี่ยวกับวิธีที่เรานำไปใช้:

  • ระดับการเข้าถึง - คุณสมบัติของเราเป็นแบบส่วนตัวและเราเปิดเผยตัวรับและตัวตั้งค่า
  • ชื่อเมธอด - getters และ setters ของเราเป็นไปตามระเบียบgetXและsetX (ในกรณีของบูลีนสามารถใช้isXสำหรับ getter ได้)
  • Default Constructor - ต้องมีตัวสร้างที่ไม่มีอาร์กิวเมนต์เพื่อให้สามารถสร้างอินสแตนซ์ได้โดยไม่ต้องให้อาร์กิวเมนต์ตัวอย่างเช่นในระหว่างการ deserialization
  • ทำให้เป็นอนุกรมได้ - การใช้อินเทอร์เฟซต่ออนุกรมทำให้เราสามารถจัดเก็บสถานะ

3.2. EmployeePojoเป็น JavaBean

ลองแปลงEmployeePojoเป็น JavaBean:

public class EmployeeBean implements Serializable { private static final long serialVersionUID = -3760445487636086034L; private String firstName; private String lastName; private LocalDate startDate; public EmployeeBean() { } public EmployeeBean(String firstName, String lastName, LocalDate startDate) { this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } //  additional getters/setters }

3.3. การสะท้อนด้วย JavaBean

เมื่อเราตรวจสอบถั่วของเราด้วยการไตร่ตรองตอนนี้เราจะได้รับรายการคุณสมบัติทั้งหมด:

[firstName, lastName, startDate]

4. แลกเปลี่ยนเมื่อใช้ JavaBeans

ดังนั้นเราจึงได้แสดงวิธีที่ JavaBeans มีประโยชน์ โปรดทราบว่าทุกตัวเลือกการออกแบบมาพร้อมกับการแลกเปลี่ยน

เมื่อเราใช้ JavaBeans เราควรคำนึงถึงข้อเสียที่อาจเกิดขึ้นด้วย:

  • ความไม่แน่นอน - JavaBeans ของเราไม่แน่นอนเนื่องจากวิธีการ setter ซึ่งอาจนำไปสู่ปัญหาการเกิดพร้อมกันหรือความสอดคล้อง
  • Boilerplate - เราต้องแนะนำ getters สำหรับคุณสมบัติและ setters ทั้งหมดส่วนใหญ่อาจไม่จำเป็น
  • ตัวสร้างอาร์กิวเมนต์เป็นศูนย์ - เรามักต้องการอาร์กิวเมนต์ในตัวสร้างของเราเพื่อให้แน่ใจว่าวัตถุได้รับการสร้างอินสแตนซ์ในสถานะที่ถูกต้อง แต่มาตรฐาน JavaBean กำหนดให้เราต้องจัดเตรียมตัวสร้างอาร์กิวเมนต์ที่เป็นศูนย์

ด้วยการแลกเปลี่ยนเหล่านี้กรอบจึงได้ปรับให้เข้ากับอนุสัญญาถั่วอื่น ๆ ในช่วงหลายปี

5. สรุป

ในบทช่วยสอนนี้เราเปรียบเทียบ POJO กับ JavaBeans

อันดับแรกเราได้เรียนรู้ POJO เป็นอ็อบเจ็กต์ Java ที่ไม่ถูกผูกไว้กับเฟรมเวิร์กที่เฉพาะเจาะจงและ JavaBean เป็น POJO ชนิดพิเศษที่มีชุดแบบแผนที่เข้มงวด

จากนั้นเราได้เห็นว่าเฟรมเวิร์กและไลบรารีบางส่วนใช้ประโยชน์จากหลักการตั้งชื่อ JavaBean เพื่อค้นหาคุณสมบัติของคลาสอย่างไร

ตามปกติตัวอย่างจะมีอยู่ใน GitHub