Perbedaan antara DTO, VO, POJO, JavaBeans?

Jawaban:

848

JavaBeans

JavaBean adalah kelas yang mengikuti konvensi JavaBeans seperti yang didefinisikan oleh Sun. Wikipedia memiliki ringkasan yang cukup bagus tentang apa itu JavaBeans :

JavaBeans adalah komponen perangkat lunak yang dapat digunakan kembali untuk Java yang dapat dimanipulasi secara visual dalam alat pembangun. Praktis, mereka adalah kelas yang ditulis dalam bahasa pemrograman Java sesuai dengan konvensi tertentu. Mereka digunakan untuk merangkum banyak objek menjadi objek tunggal (kacang), sehingga mereka dapat dilewatkan sebagai objek kacang tunggal alih-alih sebagai beberapa objek individual. JavaBean adalah Obyek Java yang dapat diserialkan, memiliki konstruktor nullary, dan memungkinkan akses ke properti menggunakan metode pengambil dan penyetel.

Untuk berfungsi sebagai kelas JavaBean, kelas objek harus mematuhi konvensi tertentu tentang penamaan metode, konstruksi, dan perilaku. Konvensi ini memungkinkan untuk memiliki alat yang dapat menggunakan, menggunakan kembali, mengganti, dan menghubungkan JavaBeans.

Konvensi yang diperlukan adalah:

  • Kelas harus memiliki konstruktor default publik. Ini memungkinkan instantiasi yang mudah dalam kerangka pengeditan dan aktivasi.
  • Properti kelas harus dapat diakses menggunakan get, set, dan metode lain (disebut metode accessor dan metode mutator), mengikuti konvensi penamaan standar. Ini memungkinkan inspeksi otomatis yang mudah dan pembaruan status kacang dalam kerangka kerja, banyak di antaranya termasuk editor khusus untuk berbagai jenis properti.
  • Kelas harus serial. Ini memungkinkan aplikasi dan kerangka kerja untuk secara andal menyimpan, menyimpan, dan memulihkan keadaan kacang dengan cara yang tidak tergantung pada VM dan platform.

Karena persyaratan ini sebagian besar dinyatakan sebagai konvensi alih-alih dengan mengimplementasikan antarmuka, beberapa pengembang melihat JavaBeans sebagai Obyek Java Kuno yang mengikuti konvensi penamaan tertentu.

POJO

Sebuah Plain Old Java Object atau POJO adalah istilah yang awalnya diperkenalkan untuk menunjuk objek Java sederhana yang ringan, tidak menerapkan javax.ejbantarmuka apa pun , yang bertentangan dengan EJB 2.x kelas berat (terutama Entity Beans, Kacang Sesi Stateless bukanlah IMO yang buruk). Hari ini, istilah ini digunakan untuk objek sederhana tanpa barang tambahan. Sekali lagi, Wikipedia melakukan pekerjaan yang baik dalam mendefinisikan POJO :

POJO adalah singkatan untuk Plain Old Java Object. Nama ini digunakan untuk menekankan bahwa objek yang dimaksud adalah Obyek Java biasa, bukan objek khusus, dan khususnya bukan Enterprise JavaBean (terutama sebelum EJB 3). Istilah ini diciptakan oleh Martin Fowler, Rebecca Parsons dan Josh MacKenzie pada September 2000:

"Kami bertanya-tanya mengapa orang begitu menentang menggunakan benda biasa dalam sistem mereka dan menyimpulkan bahwa itu karena benda sederhana tidak memiliki nama mewah. Jadi kami memberi mereka satu, dan itu tertangkap dengan sangat baik."

Istilah ini melanjutkan pola istilah lama untuk teknologi yang tidak menggunakan fitur baru yang mewah, seperti POTS (Layanan Telepon Lama Biasa) di telepon, dan PODS (Struktur Data Lama Biasa) yang didefinisikan dalam C ++ tetapi hanya menggunakan fitur bahasa C, dan POD (Dokumentasi Lama Biasa) di Perl.

Istilah ini kemungkinan besar telah diterima secara luas karena kebutuhan akan istilah umum dan mudah dipahami yang kontras dengan kerangka objek yang rumit. JavaBean adalah POJO yang dapat diserialkan, memiliki konstruktor tanpa argumen, dan memungkinkan akses ke properti menggunakan metode pengambil dan penyetel. Enterprise JavaBean bukan kelas tunggal tetapi seluruh model komponen (sekali lagi, EJB 3 mengurangi kompleksitas Enterprise JavaBeans).

Karena desain menggunakan POJO telah menjadi lebih umum digunakan, sistem telah muncul yang memberikan POJO beberapa fungsi yang digunakan dalam kerangka kerja dan lebih banyak pilihan tentang bidang fungsi mana yang sebenarnya dibutuhkan. Hibernate dan Spring adalah contohnya.

Objek Nilai

Objek Nilai atau VO adalah objek seperti java.lang.Integeryang menyimpan nilai (karenanya nilai objek). Untuk definisi yang lebih formal, saya sering merujuk pada deskripsi Martin Fowler tentang Value Object :

Dalam Pola Arsitektur Aplikasi Perusahaan saya menggambarkan Objek Nilai sebagai objek kecil seperti uang atau objek rentang tanggal. Properti utama mereka adalah bahwa mereka mengikuti semantik nilai daripada semantik referensi.

Anda biasanya dapat memberi tahu mereka karena gagasan mereka tentang kesetaraan tidak didasarkan pada identitas, sebaliknya dua objek bernilai sama jika semua bidangnya sama. Meskipun semua bidang sama, Anda tidak perlu membandingkan semua bidang jika subset unik - misalnya kode mata uang untuk objek mata uang cukup untuk menguji kesetaraan.

Heuristik umum adalah bahwa objek nilai harus sepenuhnya tidak berubah. Jika Anda ingin mengubah objek nilai Anda harus mengganti objek dengan yang baru dan tidak diizinkan untuk memperbarui nilai-nilai objek nilai itu sendiri - objek nilai yang dapat diupdate menyebabkan masalah alias.

Literatur J2EE awal menggunakan objek nilai jangka untuk menggambarkan gagasan yang berbeda, apa yang saya sebut Obyek Transfer Data . Mereka telah mengubah penggunaannya dan menggunakan istilah Obyek Transfer sebagai gantinya.

Anda dapat menemukan beberapa materi bagus tentang objek nilai di wiki dan oleh Dirk Riehle .

Objek Transfer Data

Obyek Transfer Data atau DTO adalah pola (anti) yang diperkenalkan dengan EJB. Alih-alih melakukan banyak panggilan jarak jauh pada EJB, idenya adalah untuk merangkum data dalam objek nilai yang dapat ditransfer melalui jaringan: Objek Transfer Data. Wikipedia memiliki definisi yang layak tentang Obyek Transfer Data :

Objek transfer data (DTO), sebelumnya dikenal sebagai objek nilai atau VO, adalah pola desain yang digunakan untuk mentransfer data antara subsistem aplikasi perangkat lunak. DTO sering digunakan bersama dengan objek akses data untuk mengambil data dari database.

Perbedaan antara objek transfer data dan objek bisnis atau objek akses data adalah bahwa DTO tidak memiliki perilaku apa pun kecuali untuk penyimpanan dan pengambilan data sendiri (accessor dan mutators).

Dalam arsitektur EJB tradisional, DTO melayani tujuan ganda: pertama, mereka mengatasi masalah bahwa entitas kacang tidak bersambung; kedua, mereka secara implisit menentukan fase perakitan di mana semua data yang digunakan oleh tampilan diambil dan dimasukkan ke dalam DTO sebelum mengembalikan kontrol ke tier presentasi.


Jadi, bagi banyak orang, DTO dan VO adalah hal yang sama (tetapi Fowler menggunakan VO untuk mengartikan sesuatu yang lain seperti yang kita lihat). Sebagian besar waktu, mereka mengikuti konvensi JavaBeans dan dengan demikian juga JavaBeans. Dan semuanya POJO.

Thivent Pascal
sumber
1
Jadi jika saya memiliki kelas kenyamanan yang dibuat hanya untuk mentransfer data yang tidak terkait seperti ini class SomeClass { public String foo;public String bar; }di dalam kelas dengan banyak logika yang rumit, pasti itu bukan JavaBean, itu tidak bisa berupa VO karena dapat diubah, mungkinkah itu DTO? meskipun itu tidak ditargetkan untuk pemanggilan jarak jauh dalam bentuk apa pun. Bisakah itu dianggap POJO?
Jaime Hablutzel
3
@ user2601512: Masih berupa Bean. : P Tidak ada yang salah dengan perilaku Bean - sebenarnya cukup banyak yang diharapkan. Jika tidak melakukan apa-apa lagi, itu pada dasarnya DTO.
cao
7
@xSNRG: Sebagian karena menurunkan objek ke data yang ditindaklanjuti oleh kode lain. Itu adalah langkah mundur dari perspektif OO, di mana objek bertindak dan harus bertanggung jawab atas keadaan mereka sendiri. DTO kadang-kadang merupakan solusi yang layak jika Anda benar-benar hanya mentransfer data - maka namanya - tetapi enkapsulasi pada dasarnya keluar jendela, dan Anda biasanya kehilangan jaminan validitas / konsistensi yang dapat disediakan oleh objek nyata.
cao
1
@KumaresanPerumal: Anda bisa, jika mau. Tetapi model berbeda dari lapisan data, dan memiliki tujuan dan aturan yang berbeda. Lapisan data biasanya membutuhkan semua yang diatur dan dapat diatur secara sewenang-wenang, dan model idealnya ingin menyembunyikan data dan menegakkan invarian. Anda ingin menggunakan objek model untuk penyimpanan, Anda harus berkompromi di satu sisi atau yang lain.
cHao
1
@KumaresanPerumal: Lapisan data ada untuk menyimpan dan mengambil data. Untuk melakukan itu, semuanya membutuhkan akses penuh ke objek apa pun yang menyimpan data, karena pengambilan berarti menetapkan nilai pada objek di suatu tempat. Tetapi model mengelola data dalam sistem, dan terikat oleh prinsip-prinsip OO, seperti enkapsulasi - gagasan bahwa objek harus mempertahankan kontrol atas keadaan internal mereka dan tidak memiliki kode lain yang bermain-main dengan jeroan mereka secara sewenang-wenang. DTO dapat menjembatani kesenjangan itu; lapisan data dapat mengaksesnya sesuka hati, dan model tidak harus melepaskan kontrol.
cao
66

DTO vs VO

DTO - Objek transfer data hanyalah wadah data yang digunakan untuk mengangkut data antara lapisan dan tingkatan.

  • Ini terutama mengandung atribut. Anda bahkan dapat menggunakan atribut publik tanpa getter dan setter.
  • Objek transfer data tidak mengandung logika bisnis.

Analogi:
Formulir Pendaftaran sederhana dengan atribut nama pengguna, kata sandi, dan id email.

  • Ketika formulir ini dikirimkan dalam file RegistrationServlet Anda akan mendapatkan semua atribut dari lapisan tampilan ke lapisan bisnis tempat Anda meneruskan atribut ke kacang java dan kemudian ke DAO atau lapisan ketekunan.
  • DTO membantu dalam mentransport atribut dari view layer ke layer bisnis dan akhirnya ke layer persistence.

DTO terutama digunakan untuk mendapatkan data yang diangkut di jaringan secara efisien, bahkan dari JVM ke JVM lainnya.

DTO sering java.io.Serializable- untuk mentransfer data lintas JVM.

VO - Objek Nilai [1] [2] mewakili dirinya sendiri set data dan mirip dengan Java enum. Identitas Objek Nilai didasarkan pada negara mereka daripada pada identitas objek mereka dan tidak berubah. Contoh dunia nyata adalah Color.RED, Color.BLUE, SEX.FEMALE dll.

POJO vs JavaBeans

[1] Java-Beanness dari POJO adalah bahwa atribut pribadinya semua diakses melalui getter dan setter publik yang sesuai dengan konvensi JavaBeans. misalnya

    private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 

[2] JavaBeans harus mengimplementasikan Serializable dan memiliki konstruktor tanpa argumen, sedangkan di POJO tidak memiliki batasan ini.

Srinivas MV
sumber
Maaf untuk komentar sooooo terlambat, tetapi saya belajar tentang perbedaan antara mereka dan saya punya pertanyaan. Bagaimana jika saya memiliki kelas Java Bean, tetapi dengan metode lain seperti doSomething (). Kelas macam apa itu? Salam
jscherman
@srinivas mengapa kita tidak bisa meneruskan data dalam objek java DOMAIN atau MODEL? Tetapi saya menggunakan MODEL tanpa DTO. tolong jelaskan saya secara singkat. terima kasih
Kumaresan Perumal
46

Pada dasarnya,

DTO: "Objek transfer data" dapat berpindah antar lapisan yang berbeda dalam arsitektur perangkat lunak.

VO: "Nilai objek" memegang objek seperti Integer, Uang dll.

POJO: Obyek Jawa Kuno Biasa yang bukan objek khusus.

Java Beans: membutuhkan a Java Classuntuk dapat serial, memiliki no-argkonstruktor dan pengambil dan penyetel untuk setiap bidang

Olcay Tarazan
sumber
Deskripsi ini sebagian besar salah / tidak lengkap.
cellepo
24

Kacang Jawa tidak sama dengan EJB.

The JavaBeans spesifikasi di Jawa 1.0 adalah usaha Sun untuk memungkinkan Jawa objek untuk dimanipulasi dalam IDE yang tampak seperti VB. Ada aturan yang ditetapkan untuk objek yang memenuhi syarat sebagai "Java Beans":

  1. Konstruktor default
  2. Getters dan setters untuk anggota data pribadi yang mengikuti konvensi penamaan yang tepat
  3. Serializable
  4. Mungkin orang lain yang saya lupa.

EJB datang kemudian. Mereka menggabungkan komponen terdistribusi dan model transaksional, berjalan dalam wadah yang mengelola benang, penyatuan, siklus hidup, dan menyediakan layanan. Mereka jauh dari Jawa Beans.

DTO muncul dalam konteks Java karena orang menemukan bahwa spesifikasi EJB 1.0 terlalu "cerewet" dengan database. Daripada melakukan bolak-balik untuk setiap elemen data, orang akan mengemasnya dalam Java Beans secara massal dan mengirimkannya.

POJO adalah reaksi terhadap EJB.

Duffymo
sumber
1
Saya salah dan saya memilih untuk menghapus pesan saya. Terima kasih atas koreksi. Saya ingin memperhatikan bahwa makna POJO telah berubah beberapa waktu yang lalu. Pertama, mereka hanya terbuat dari properti pribadi dan aksesornya. Sekarang, kita mempertimbangkan POJO kelas dengan penjelasan, menerapkan dan memperluas kelas-kelas lain, dll
sinuhepop
Bagaimana dengan VO, seperti yang ditanyakan Pertanyaan? Ini bukan Jawaban sampai menjawab Pertanyaan lengkap
cellepo
4

POJO : Ini adalah file java (kelas) yang tidak memperluas atau mengimplementasikan file java lainnya (kelas).

Bean : Ini adalah file java (kelas) di mana semua variabel bersifat pribadi, metode bersifat umum dan getter dan setter yang sesuai digunakan untuk mengakses variabel.

Kelas normal : Ini adalah file java (kelas) yang dapat terdiri dari variabel publik / pribadi / default / dilindungi dan yang mungkin atau mungkin tidak memperpanjang atau mengimplementasikan file java lain (kelas).

Suraj Kalokhe
sumber
Bagaimana dengan VO, seperti yang ditanyakan Pertanyaan? Ini bukan Jawaban sampai menjawab Pertanyaan lengkap
cellepo
1

Bicara Pertama Tentang

Kelas Normal - itu berarti setiap kelas mendefinisikan itu normal di java itu berarti Anda membuat berbagai jenis properti metode dll.
Bean - Bean bukan apa-apa itu hanya objek dari kelas tertentu menggunakan kacang ini Anda dapat mengakses kelas java Anda sama seperti objek. .

dan setelah itu bicara tentang POJO yang terakhir

POJO - POJO adalah kelas yang tidak memiliki layanan apa pun itu hanya memiliki konstruktor default dan properti pribadi dan properti tersebut untuk menetapkan nilai metode penyetel dan pengambil yang sesuai. Ini bentuk pendek dari Plain Java Object.

ASHISH KUMAR SINGH
sumber
Bagaimana dengan VO, seperti yang ditanyakan Pertanyaan? Ini bukan Jawaban sampai menjawab Pertanyaan lengkap
cellepo
1
  • Nilai Objek : Gunakan saat harus mengukur kesetaraan objek berdasarkan nilai objek.
  • Objek Transfer Data : Pass data dengan banyak atribut dalam satu tembakan dari klien ke server melintasi lapisan, untuk menghindari beberapa panggilan ke server jauh.
  • Plain Old Java Object : Seperti kelas sederhana yang sifatnya, konstruktor tanpa argumen publik. Seperti yang kami nyatakan untuk entitas JPA.

perbedaan-antara-nilai-objek-pola-dan-data-transfer-pola

Atul Jain
sumber