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