JavaBean และ POJO แตกต่างกันอย่างไร


210

ฉันไม่แน่ใจเกี่ยวกับความแตกต่าง ฉันใช้ Hibernate และในหนังสือบางเล่มพวกเขาใช้ JavaBean และ POJO เป็นคำที่ใช้แทนกันได้ ฉันต้องการทราบว่ามีความแตกต่างไม่ใช่แค่ในบริบทของไฮเบอร์เนต แต่เป็นแนวคิดทั่วไป

คำตอบ:


252

JavaBean ปฏิบัติตามอนุสัญญาบางอย่าง การตั้งชื่อ Getter / setter มีตัวสร้างค่าเริ่มต้นสาธารณะเป็นแบบอนุกรมและอื่น ๆ ดูที่JavaBeans Conventionsสำหรับรายละเอียดเพิ่มเติม

POJO (วัตถุธรรมดา Java-object) ไม่ได้ถูกกำหนดอย่างเข้มงวด มันเป็นวัตถุ Java ที่ไม่มีความต้องการที่จะใช้ส่วนต่อประสานที่เฉพาะเจาะจงหรือสืบทอดมาจากคลาสพื้นฐานที่เฉพาะเจาะจงหรือใช้ประโยชน์จากคำอธิบายประกอบเฉพาะเพื่อให้เข้ากันได้กับกรอบงานที่กำหนดและสามารถเป็นกฎเกณฑ์ใดก็ได้ วัตถุ Java


41
โปรดทราบว่า JavaBean สามารถและมักจะเป็น POJO และ POJO จำนวนมากเป็น JavaBeans จริง
Joachim Sauer

8
ไม่ตามนิยามของ POJO Java Bean ไม่ได้เป็น POJO เพราะจะถือว่า Java Bean เป็นคลาสที่ต้องปฏิบัติตามอนุสัญญาการเข้ารหัสบางอย่าง (เช่นมีคอนสตรัคเตอร์ no-ARG มีวิธีการเริ่มต้นด้วยคำว่า "รับ" และ / หรือ "set") หรือแจกจ่ายด้วยคลาส BeanInfo
Nat

15
เนื่องจากสิ่งเหล่านี้เป็นแบบแผนฉันคิดว่าคุณสามารถยืนยันได้ว่าถั่วสามารถเป็น POJO (เช่นคุณไม่ได้รับมรดกจากอินเทอร์เฟซ JavaBean หรือคล้ายกัน)
Brian Agnew

1
ข้อมูลจำเพาะ JavaBeans ล้มเหลวในการกำหนด JavaBean ที่นอกเหนือจากหลวม ๆ เป็น "ส่วนประกอบซอฟต์แวร์ที่สามารถใช้ซ้ำได้" (หรือบางส่วน) มันไม่จำเป็นต้องมีคอนสตรัคเตอร์ no-arg ไม่ต้องการวิธีการที่ขึ้นต้นด้วย "get" หรือ "set" ไม่จำเป็นต้องเป็น serialisable ไม่จำเป็นต้องเป็นคลาส
Tom Hawtin - tackline

4
ในแง่คณิตศาสตร์เราสามารถพูดได้ว่า Javabeans สร้างชุดย่อยของ POJO เนื่องจากข้อ จำกัด เฉพาะที่วางไว้กับ POJO ทำให้เป็น Javabean
Nishit

106

JavaBeans ทั้งหมดเป็น POJO แต่ไม่ใช่ POJO ทั้งหมดเป็น JavaBeans

JavaBean เป็นวัตถุ Java ที่เป็นไปตามข้อกำหนดการเขียนโปรแกรมบางอย่าง:

  • คลาส JavaBean ต้องใช้งาน Serializable หรือ Externalizable
  • คลาส JavaBean จะต้องมีคอนสตรัคเตอร์ no-arg สาธารณะ
  • คุณสมบัติ JavaBean ทั้งหมดต้องมี setter สาธารณะและเมธอด getter (ตามความเหมาะสม);
  • ตัวแปรอินสแตนซ์ JavaBean ทั้งหมดควรเป็นแบบส่วนตัว

1
ฉันคิดว่า POJO ไม่สามารถใช้งานSerializableได้
naXa

10
"คลาส JavaBean ต้องมีตัวสร้างแบบไม่มีอาร์กิวเมนต์" เพิ่มสาธารณะที่นี่ด้วย
radistao

JavaBean สามารถทำให้เป็นอนุกรมและนั่นคือเหตุผลที่ JavaBean ไม่ใช่ POJO
karlihnos

25

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

คำประกาศเกียรติคุณในขณะที่ Rebecca Parsons, Josh MacKenzie และฉันกำลังเตรียมตัวสำหรับการพูดคุยในการประชุมในเดือนกันยายน 2000 ในการพูดคุยเราได้ชี้ให้เห็นถึงประโยชน์มากมายของการเข้ารหัสตรรกะทางธุรกิจลงในวัตถุจาวาปกติแทนที่จะใช้ Entity Beans เราสงสัยว่าทำไมผู้คนถึงต่อต้านการใช้วัตถุปกติในระบบของพวกเขาและสรุปว่าเป็นเพราะวัตถุธรรมดา ๆ ไม่มีชื่อแฟนซี ดังนั้นเราจึงให้พวกเขาหนึ่งอันและมันก็ติดแน่นมาก

http://www.martinfowler.com/bliki/POJO.html


7

POJO: ถ้าคลาสสามารถดำเนินการได้ด้วย JDK ที่อยู่ภายใต้การสนับสนุนโดยไม่ต้องมีไลบรารีบุคคลที่สามภายนอกอื่นจากนั้นจะเรียกว่า POJO

JavaBean: หากคลาสมีเพียงแอ็ตทริบิวต์ที่มี accessors (setters และ getters) ที่เรียกว่า javabeans โดยทั่วไปแล้ว Java beans จะไม่มีตรรกะทางธุรกิจที่ค่อนข้างจะใช้สำหรับเก็บข้อมูลบางอย่าง

Javabeans ทั้งหมดเป็น POJO แต่ POJO ทั้งหมดไม่ใช่ Javabeans


7

Pojo - วัตถุ java เก่าธรรมดา

คลาส pojo เป็นคลาสธรรมดาที่ไม่มีความพิเศษใด ๆ คลาสที่รวมกันอย่างหลวม ๆ จากเทคโนโลยี / กรอบงานคลาสนั้นไม่ได้ดำเนินการจากเทคโนโลยี / กรอบงานและไม่ได้ขยายจากเทคโนโลยี / กรอบงาน API ที่คลาสนั้นเรียกว่าคลาส pojo

คลาส pojo สามารถใช้อินเตอร์เฟสและขยายคลาสได้ แต่คลาสซูเปอร์หรืออินเตอร์เฟสไม่ควรเป็นเทคโนโลยี / กรอบงาน

ตัวอย่าง :

1

class ABC{
----
}

คลาส ABC ไม่ได้นำไปใช้หรือขยายจากเทคโนโลยี / กรอบงานนั่นคือสาเหตุที่คลาส pojo

2

class ABC extends HttpServlet{
---
}

คลาส ABC ขยายจากเทคโนโลยี servlet api นั่นคือสาเหตุที่นี่ไม่ใช่คลาส pojo

3

class ABC implements java.rmi.Remote{
----
}

คลาส ABC ใช้จาก rmi api นั่นคือสาเหตุที่นี่ไม่ใช่คลาส pojo

4

class ABC implements java.io.Serializable{
---
}

ส่วนต่อประสานนี้เป็นส่วนหนึ่งของภาษาจาวาไม่ได้เป็นส่วนหนึ่งของเทคโนโลยี / framework.so นี่คือคลาส pojo

5

class ABC extends Thread{
--
}

เธรดที่นี่ยังเป็นคลาสของภาษาจาวาดังนั้นนี่จึงเป็นคลาส pojo

6

class ABC extends Test{
--
}

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

7

ตอนนี้จุดนี้เป็นกรณีพิเศษ

@Entity
class ABC{
--
}

@Entityเป็นคำอธิบายประกอบที่กำหนดโดย hibernate api หรือ jpa api แต่เรายังสามารถเรียกคลาสนี้ว่าคลาส pojo คลาสที่มีคำอธิบายประกอบที่ได้รับจากเทคโนโลยี / กรอบเรียกว่าคลาส pojo โดยกรณีพิเศษนี้



1

POJOSมีการประชุมบางอย่าง (getter / หมาประชาชนคอนสตรัคไม่มีหาเรื่องตัวแปรเอกชน) และอยู่ในการดำเนินการ (อดีต. ถูกนำมาใช้สำหรับการอ่านข้อมูลตามรูปแบบ) JAVABEANSเป็น


1

โดยสรุป: ความเหมือนและความแตกต่างคือ:

   java beans:                          Pojo:
-must extends serializable              -no need to extends or implement.
 or externalizable.                     
-must have public class .               - must have public class
-must have private instance variables.      -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor.           - can have constructor with agruments.

JAVA Beans ทั้งหมดเป็น POJO แต่ไม่ใช่ POJO ทั้งหมดคือ JAVA Beans


0

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

แต่อย่าเพิ่งแฮงค์คำจำกัดความ ลองดูที่ความหมายของสิ่งต่าง ๆ ที่นี่

JavaBeans ใช้ในแอปพลิเคชัน Enterprise Java ที่ผู้ใช้เข้าถึงข้อมูลและ / หรือรหัสแอปพลิเคชันจากระยะไกลเช่นจากเซิร์ฟเวอร์ (ผ่านเว็บหรือเครือข่ายส่วนตัว) ผ่านเครือข่าย ข้อมูลที่เกี่ยวข้องจะต้องถูกสตรีมในรูปแบบอนุกรมเข้าหรือออกจากคอมพิวเตอร์ของผู้ใช้ดังนั้นความต้องการวัตถุ Java EE ในการใช้งานอินเตอร์เฟส Serializable ลักษณะส่วนใหญ่ของ JavaBean นี้ไม่แตกต่างจากแอปพลิเคชัน Java SE ที่มีการอ่านข้อมูลจากหรือเขียนไปยังระบบไฟล์ การใช้คลาส Java อย่างเชื่อถือได้ผ่านเครือข่ายจากชุดของเครื่องผู้ใช้ / ระบบปฏิบัติการที่หลากหลายยังต้องการการยอมรับของอนุสัญญาสำหรับการจัดการของพวกเขา ดังนั้นความต้องการสำหรับการใช้งานคลาสเหล่านี้เป็นแบบสาธารณะพร้อมกับแอ็ตทริบิวต์ส่วนตัวคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์และตัวรับสัญญาณมาตรฐานและตัวตั้งค่า

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

โดยรวมแล้วคุณสามารถเห็น Java Beans เป็นเพียงวัตถุ Java ที่ปรับให้ใช้ผ่านเครือข่าย

มีโฆษณาเกินจริงมากมาย - และไม่มีการถ่อมตัวในโลกซอฟต์แวร์ตั้งแต่ปี 1995

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