Apa itu Kelas POJO?

1. Ikhtisar

Dalam tutorial singkat ini, kita akan menyelidiki definisi "Objek Java Lama Biasa" atau disingkat POJO.

Kami akan melihat bagaimana POJO dibandingkan dengan JavaBean, dan bagaimana mengubah POJO kami menjadi JavaBeans dapat membantu.

2. Benda Jawa Kuno Biasa

2.1. Apa itu POJO ?

Saat kami berbicara tentang POJO, yang kami gambarkan adalah tipe langsung tanpa referensi ke kerangka kerja tertentu. POJO tidak memiliki konvensi penamaan untuk properti dan metode kami.

Mari buat POJO karyawan dasar. Ini akan memiliki tiga properti; nama depan, nama belakang, dan tanggal mulai:

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; } }

Kelas ini dapat digunakan oleh program Java apa pun karena tidak terikat pada kerangka kerja apa pun.

Namun, kami tidak mengikuti konvensi nyata apa pun untuk membangun, mengakses, atau mengubah status kelas.

Kurangnya kesepakatan menyebabkan dua masalah:

Pertama, meningkatkan kurva pembelajaran untuk pembuat kode yang mencoba memahami cara menggunakannya.

Kedua, mungkin membatasi kemampuan framework untuk mendukung konvensi daripada konfigurasi, memahami cara menggunakan kelas, dan menambah fungsionalitasnya.

Untuk menjelajahi poin kedua ini, mari bekerja dengan EmployeePojo menggunakan refleksi. Jadi, kami akan mulai menemukan beberapa keterbatasannya.

2.2. Refleksi dengan POJO

Mari tambahkan dependensi commons-beanutils ke proyek kita:

 commons-beanutils commons-beanutils 1.9.4 

Dan sekarang, mari kita periksa properti POJO kami:

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

Jika kita mencetak propertyNames ke konsol, kita hanya akan melihat:

[start] 

Di sini, kita melihat bahwa kita hanya memulai sebagai properti kelas. PropertyUtils gagal menemukan dua lainnya.

Kami akan melihat hasil yang sama jika kami menggunakan perpustakaan lain seperti Jackson untuk memproses EmployeePojo.

Idealnya, kami akan melihat semua properti kami: firstName , lastName, dan startDate. Dan kabar baiknya adalah banyak library Java yang secara default mendukung sesuatu yang disebut konvensi penamaan JavaBean.

3. JavaBeans

3.1. Apa itu JavaBean ?

JavaBean masih merupakan POJO tetapi memperkenalkan seperangkat aturan ketat tentang cara kami menerapkannya:

  • Tingkat akses - properti kami bersifat pribadi dan kami mengekspos pengambil dan penyetel
  • Nama metode - getter dan setter kami mengikuti konvensi getX dan setX (dalam kasus boolean, isX dapat digunakan untuk getter)
  • Konstruktor Default - konstruktor tanpa argumen harus ada sehingga instance dapat dibuat tanpa memberikan argumen, misalnya selama deserialisasi
  • Serializable - mengimplementasikan antarmuka Serializable memungkinkan kita untuk menyimpan negara

3.2. EmployeePojo sebagai JavaBean

Jadi, mari kita coba mengubah EmployeePojo menjadi 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. Refleksi dengan JavaBean

Saat kami memeriksa kacang kami dengan refleksi, sekarang kami mendapatkan daftar lengkap properti:

[firstName, lastName, startDate]

4. Pengorbanan Saat Menggunakan JavaBeans

Jadi, kami telah menunjukkan cara JavaBeans bermanfaat. Ingatlah bahwa setiap pilihan desain memiliki pengorbanan.

Saat kami menggunakan JavaBeans, kami juga harus memperhatikan beberapa potensi kerugian:

  • Mutabilitas - JavaBeans kami dapat berubah karena metode penyetelnya - ini dapat menyebabkan masalah konkurensi atau konsistensi
  • Boilerplate - kita harus memperkenalkan getter untuk semua properti dan setter untuk sebagian besar properti, sebagian besar mungkin tidak diperlukan
  • Konstruktor tanpa argumen - kita sering membutuhkan argumen dalam konstruktor untuk memastikan objek dibuat dalam keadaan yang valid, tetapi standar JavaBean mengharuskan kita untuk menyediakan konstruktor argumen nol

Mengingat pengorbanan ini, kerangka kerja juga telah beradaptasi dengan konvensi kacang lainnya selama bertahun-tahun.

5. Kesimpulan

Dalam tutorial ini, kami membandingkan POJO dengan JavaBeans.

Pertama, kita mempelajari POJO adalah objek Java yang tidak terikat pada kerangka kerja tertentu, dan bahwa JavaBean adalah jenis khusus POJO dengan sekumpulan konvensi yang ketat.

Kemudian, kami melihat bagaimana beberapa framework dan library memanfaatkan konvensi penamaan JavaBean untuk menemukan properti kelas.

Seperti biasa, contoh tersedia di GitHub.