Fungsi Objek Jawa Umum dengan Proyek Lombok

Project Lombok adalah pustaka kecil yang dapat digunakan untuk mengurangi jumlah kode Java boilerplate yang biasanya ditulis untuk kelas Java. Project Lombok melakukan ini melalui anotasi yang dapat ditambahkan ke kelas Java yang memerlukan metode umum. Sebagian besar anotasi bersifat deskriptif sendiri dalam namanya: @Getter, @Setter, @EqualsAndHashCode, @ToString, dan @NoArgsConstructor adalah contohnya. Dalam posting ini, saya mendemonstrasikan akan menerapkan anotasi Lombok sederhana untuk menambahkan metode yang umum ditulis ini ke kelas Java.

Berikut ini kelas sederhana tanpa versi toString () yang diganti sebelumnya.

Person.java tanpa toString

package dustin.examples; /** * Simple Person class without boilerplate. * * @author Dustin */ public class Person { private String lastName; private String firstName; } 

Ketika kelas di atas dibuat dan metode yang diwariskan secara implisit (dari Object) toString () dipanggil, keluarannya terlihat seperti yang ditunjukkan pada gambar berikutnya.

Kita bisa menulis metode toString () eksplisit atau menggunakan Project Lombok. Potongan kode berikutnya menunjukkan pendekatan Proyek Lombok.

Person.java dengan Anotasi @ToString Lombok

package dustin.examples; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString public class Person { private String lastName; private String firstName; } 

Keluaran dari mencetak konten kelas ini dengan toString () yang disediakan Lombok akan ditampilkan berikutnya.

Ada representasi toString () yang lebih baik dari objek Person sekarang, tetapi bidangnya masih belum diinisialisasi, jadi kita hanya melihat nilai null. Kita bisa menggunakan Lombok lagi untuk membuat konstruktor.

Person.java dengan Anotasi @AllArgsConstructor Lombok

package dustin.examples; import lombok.AllArgsConstructor; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor public class Person { private String lastName; private String firstName; } 

Sekarang saya dapat (pada kenyataannya, harus) mengirimkan parameter pada instansiasi objek Person. Hasilnya ditunjukkan pada gambar layar berikutnya. Dalam kasus ini, kode klien saya (Main.java) menunjukkan kesalahan waktu kompilasi di NetBeans karena NetBeans tidak percaya bahwa ada konstruktor di Person yang menerima dua String. Meskipun ada tanda berlekuk-lekuk merah, kode tersebut benar-benar dibangun ketika saya meminta NetBeans untuk membuatnya.

Kelas seperti Person.java sering kali merupakan kelas data yang perlu digunakan dalam perbandingan dan mungkin kunci koleksi berbasis hashCode. Penting untuk membuat implementasi sama dengan (Object) dan hashCode () dengan benar dan untuk memastikan keduanya dibuat bersama. Karena ada metode default yang sama dan hashCode yang disediakan oleh kelas Object induk, kode Java yang menggunakan instance Person akan dapat melakukan persamaan dan / atau hashCode, tetapi mereka tidak mungkin menjadi yang diinginkan. Ketika kelas utama yang dapat dieksekusi diubah ke daftar kode berikutnya, kita melihat keluaran setelah itu yang memberi tahu kita bahwa perbandingan kesetaraan dilakukan sepenuhnya berdasarkan identitas daripada konten.

Main.java Bahwa Tes sama dengan () Implementasi

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } } } 

Ini hampir tidak pernah yang diinginkan di sini. Sebaliknya, diperlukan implementasi yang sama secara eksplisit. Saya suka fakta bahwa penjelasan Lombok untuk ini, @EqualsAndHashCode, hanya menghasilkan keduanya secara bersamaan karena tidak masuk akal untuk menimpanya secara eksplisit satu per satu. Daftar kelas Person.java ditampilkan berikutnya dengan tambahan anotasi @EqualsAndHashCode.

Person.java dengan @EqualsAndHashCode

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { private String lastName; private String firstName; } 

Outputnya lebih baik sekarang.

Saya masih belum memiliki cara yang baik untuk mengakses setiap bidang publik secara terpisah jika diperlukan. Misalnya, jika saya ingin melakukan sesuatu dalam kode saya berdasarkan nama belakang, saya tidak memiliki cara yang baik untuk melakukannya tanpa mengambil langkah drastis. Saya bisa menggunakan Lombok di sini lagi.

Untuk contoh ini, anggaplah kita membuat asumsi yang salah bahwa hanya nama belakang orang tersebut yang mungkin berubah. Karena asumsi ini, kami hanya akan memberikan anotasi Lombok @Setter untuk nama belakang, tetapi dengan memberikan anotasi @Getter untuk kedua bidang. Kode Orang yang diubah ditampilkan berikutnya.

Person.java dengan @Getter dan @Setter

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { @Getter @Setter private String lastName; @Getter private String firstName; } 

Berikut adalah kelas Utama yang diperbarui untuk menjalankan contoh ini:

Main.java yang Memanfaatkan Setter / Getter Baru

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } final Person accessiblePerson = new Person("Garzminski", "Gary"); out.println("The last name is " + accessiblePerson.getLastName()); out.println("The first name is " + accessiblePerson.getFirstName()); //accessiblePerson.setFirstName("Grady"); accessiblePerson.setLastName("Garfunkel"); out.println("The new last name is " + accessiblePerson.getLastName()); } } 

Saya harus mengomentari panggilan untuk menetapkan nama depan Orang tersebut sehingga kodenya akan dibangun. Sekarang berjalan seperti yang ditunjukkan pada cuplikan layar berikutnya.

Koleksi anotasi Lombok ini kemungkinan besar diinginkan secara umum, terutama untuk kelas berorientasi data. Karena alasan ini, Project Lombok menyediakan anotasi teragregasi seperti @Data yang menyediakan kumpulan anotasi ini. Dalam kasus ini, saya bisa mendapatkan perilaku yang sangat mirip dengan beberapa anotasi individual yang saya berikan dengan menggunakan @Data. Anotasi @Data mengarah ke Lombok untuk menerapkan @Getter ke semua bidang dan @Setter ke semua bidang non-final. Perbedaan utama lainnya dari apa yang saya gunakan adalah menggunakan @RequiredArgsConstructor daripada @AllArgsConstructor.

Salah satu cara terbaik untuk melihat apa yang telah dilakukan Project Lombok pada file .class yang dikompilasi adalah dengan menggunakan javap. Ini ditampilkan di snapshot layar berikutnya.

Kita melihat dalam output ini bahwa sekumpulan metode yang biasa dilihat kode boilerplate tersedia di Person.class yang dikompilasi. Ada konstruktor berparameter dua argumen, hashCode (), sama dengan (Object), toString (), dan metode get dan set yang diharapkan.

Proyek Lombok bukannya tanpa keprihatinan dan batasan. Banyak di antaranya yang diartikulasikan sebagai tanggapan atas posting Hamlet D'Arcy tentang Java Tanpa Pelat Boiler - Proyek Lombok. Salah satu batasannya adalah berkurangnya dukungan di IDE selain Eclipse (meskipun ada dukungan NetBeans yang layak dan javac didukung). Perhatiannya adalah perlunya orang lain menggunakan dan memelihara kode tersebut agar memiliki ketergantungan baru di Lombok. Kekhawatiran ini dapat dikurangi melalui penggunaan delombok, yang dapat digunakan dalam proses pembangunan jika perlu.

Artikel dan posting blog lain yang meliput Proyek Lombok termasuk Proyek Lombok - Jangan pernah Menulis Kode Boilerplate Java Lagi, Java Tanpa Boilerplate - Proyek Lombok, Proyek Lombok: Bye Bye Boilerplate, Wawancara Proyek Lombok Posse, Proyek Lombok: Mengakhiri Verbositas Java , Project Lombok - A Must-Have in Your Java Toolkit, Project Lombok: Pintasan Kacang Menarik dengan Prosesor Anotasi, Wawancara: Reinier dan Roel di Lombok, Mengurangi Kode Boilerplate dengan Project Lombok, Perkembangan Cepat dengan Lombok, Lombok Mengurangi Kode Boilerplate Anda, dan Alternatif yang Lebih Baik untuk Para Penangkap dan Penyetel.

Artikel ini, "Fungsi Objek Umum Java dengan Proyek Lombok" awalnya diterbitkan oleh JavaWorld.