Pencari / penyetel Lombok vs catatan Java 14

10

Saya suka proyek Lombok tetapi hari ini saya membaca dan mencoba beberapa fitur baru java 14.

Di dalam kapabilitas baru, ada kata kunci rekam yang memungkinkan membuat kelas dengan fungsi bawaan berikut sudah ada: konstruktor, bidang final pribadi, pengakses, kode sama / hash, getter, metode toString.

Sekarang pertanyaan saya adalah: lebih baik mengandalkan fitur Lombok atau haruskah kita mulai menggunakan fungsionalitas rekam:

Lebih baik menggunakan ini:

record Person (String name, String surname) {}

atau itu:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

Apa pro dan kontra dari kedua pendekatan tersebut?

gixlg
sumber
Untuk satu hal, recordtidak akan bekerja untuk hal-hal yang mengharapkan getter dan setter gaya JavaBeans.
Mark Rotteveel
2
Maksud dari komentar Rotteveel adalah bahwa metode pengakses properti pada suatu record diberi nama yang sama dengan properti tersebut. Jadi, alice.phoneNumber()daripada JavaBeans konvensi awalan dengan get, seperti pada alice.getPhoneNumber().
Basil Bourque
1
The recordfitur adalah fitur preview , belum siap untuk digunakan dalam produksi.
Basil Bourque
Catatan memiliki banyak batasan dibandingkan dengan kelas, catatan tidak dapat memperpanjang catatan atau kelas lain misalnya, periksa bagian pembatasan pada JEP ini openjdk.java.net/jeps/359 untuk perincian lebih lanjut
NAIT

Jawaban:

9

Lombok, dan recordfitur bahasa Jawa, adalah alat yang berbeda untuk hal yang berbeda. Ada beberapa tumpang tindih yang dangkal, tetapi jangan biarkan itu mengganggu Anda.

Lombok sebagian besar tentang kenyamanan sintaksis ; ini adalah prosesor-makro yang sudah dimuat sebelumnya dengan beberapa pola kode bermanfaat yang diketahui. Itu tidak memberi semantik apa pun; itu hanya mengotomatiskan pola, menurut beberapa tombol yang Anda atur dalam kode dengan anotasi. Lombok murni tentang kenyamanan menerapkan kelas pembawa data.

Rekaman adalah fitur semantik ; mereka adalah tupel nominal . Dengan membuat deklarasi semantik yang Point merupakan tupel (int x, int y), kompiler dapat memperoleh perwakilannya, serta konstruksi, deklarasi, kesetaraan, hashing, dan protokol representasi string, dari deskripsi keadaan ini. Karena mereka membawa semantik, pembaca dan kerangka kerja juga dapat bernalar dengan kepercayaan yang lebih tinggi tentang API catatan. (Ini mungkin juga nyaman secara sintaksis; jika demikian, itu bagus.)

Brian Goetz
sumber
1
+1 Brian Goetz: Dan itu dengan asumsi Anda bisa mendapatkan versi Lombok saat ini ke IDE Anda. Saya ingin tahu apakah Lombok memiliki keunggulan yang berarti sehubungan dengan membaca kode lebih cepat yang tidak akan diberikan komentar kelas.
Batang
4

Saya telah bermain-main dengan kombinasi ini untuk beberapa waktu juga dan dengan sedikit latihan saya bisa menuliskan perbedaan berikut:

Lombok

  • Rekaman belum merupakan fitur yang dirilis dan hanya merupakan fitur pratinjau. Jadi tinggal dengan Lombok lebih masuk akal.
  • Mereka belum menjadi alat yang ampuh untuk menghilangkan Lombok bersama-sama. Perhatikan bahwa perpustakaan memiliki lebih banyak hal untuk ditawarkan daripada sekadar @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • Berpengalaman sendiri, EqualsAndHashCodetidak sama dengan yang Anda harapkan ketika bermigrasi ke catatan .

Rekaman

  • Pada catatan yang berbeda, jika persyaratan representasi objek Anda adalah "pembawa data" Anda masih dapat mencari keuntungan dari Records, tanpa bergantung pada perpustakaan tambahan untuk mengurangi kode boilerplate untuk melakukan hal itu dengan tepat. Itulah alasan bahwa sebagai catatan konklusif blog ini membaca yang berikut:

    Ini juga akan membantu tim menghilangkan banyak implementasi kode tangan dari pola dasar dan mengurangi atau menghilangkan kebutuhan perpustakaan seperti Lombok.

Tentu saja, setiap hari, selalu bijaksana berdasarkan persyaratan proyek untuk memilih cara mana yang harus diikuti dan dipraktikkan.

Naman
sumber
Catatan - Saya akan mencoba untuk terus memperbarui ini dengan lebih banyak contoh untuk menjadi pengguna yang sering menggunakan keduanya saat ini.
Naman
3

NB: Alih-alih pohon natal anotasi itu, Anda bisa menggunakannya @Valuedi kelas. Perhatikan bahwa ini membuat kelas menjadi final, dan membuat semua bidang menjadi pribadi dan final, dan memberi Anda semua sisanya juga. Ini dekat dengan apa catatan itu (mereka juga final, dan semua bidang di dalamnya adalah final).

recordmasih dalam pratinjau, jadi untuk kode produksi, jelas itu belum cocok. Gunakan lombok.

Setelah catatan keluar dari pratinjau, itu lebih rumit. Lombok JAUH lebih fleksibel; Anda dapat dengan mudah bertukar dalam beberapa aspek baru tanpa harus menulis ulang semua kode (Anda bisa, misalnya, menambahkan klausa 'extends' ke kelas Anda tanpa harus kemudian menulis dengan tangan sama dengan dan metode kode hash; sesuatu catatan tidak bisa memberi Anda). Lombok juga memberi Anda lebih banyak fitur: Misalnya Anda dapat menambahkan pembangun dengan menambahkan @Builderanotasi; bukan sesuatu yang bisa dilakukan oleh catatan.

Jika sangat tidak mungkin Anda akan menggunakan semua itu untuk kelas yang Anda rancang - saya akan menggunakan catatan.

PENOLAKAN: Saya kontributor inti untuk Proyek Lombok.

rzwitserloot
sumber