Fungsi Objek Java Biasa dengan Projek Lombok

Project Lombok adalah perpustakaan kecil yang dapat digunakan untuk mengurangi jumlah kod Java boilerplate yang biasanya ditulis untuk kelas Java. Project Lombok melakukan ini melalui anotasi yang dapat ditambahkan ke kelas Java yang mana kaedah umum diinginkan. Sebilangan besar anotasi adalah deskriptif sendiri dengan nama mereka: @Getter, @Setter, @EqualsAndHashCode, @ToString, dan @NoArgsConstructor adalah contoh. Dalam catatan ini, saya menunjukkan akan menggunakan anotasi Lombok sederhana untuk menambahkan kaedah yang biasa ditulis ini ke kelas Java.

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

toString-kurang Orang.java

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

Apabila kelas di atas dihasilkan dan kaedah yang diwariskan secara implisit (dari Objek) hingga String () dipanggil, output kelihatan seperti yang ditunjukkan pada gambar seterusnya.

Kita boleh menulis kaedah toString () eksplisit atau menggunakan Project Lombok. Coretan kod seterusnya menunjukkan pendekatan Project 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; } 

Hasil dari mencetak kandungan kelas ini dengan Lombok yang disediakan untuk String () ditunjukkan seterusnya.

Terdapat representasi toString () objek Person yang lebih baik sekarang, tetapi bidangnya masih belum diinisialisasi, jadi kami hanya melihat nilai nol. Kita boleh 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; } 

Saya sekarang boleh (sebenarnya, mesti) menyampaikan parameter semasa memberi contoh objek Orang. Hasilnya ditunjukkan pada gambar skrin seterusnya. Dalam kes ini, kod pelanggan saya (Main.java) menunjukkan ralat waktu kompilasi dalam NetBeans kerana NetBeans tidak percaya bahawa ada pembangun dalam Person yang menerima dua Strings. Walaupun terdapat tanda merah, kod itu terbentuk ketika saya meminta NetBeans membinanya.

Kelas seperti Person.java sering merupakan kelas data yang perlu digunakan dalam perbandingan dan mungkin kunci pengumpulan berdasarkan hashCode. Penting untuk membuat implementasi sama (Objek) dan hashCode () dengan betul dan memastikan ia dibuat bersama. Kerana ada kaedah default sama dan hashCode yang disediakan oleh kelas Objektif induk, kod Java menggunakan instance Person akan dapat melakukan sama dan / atau hashCode, tetapi tidak mungkin seperti yang sebenarnya diinginkan seseorang. Apabila kelas boleh laku Utama diubah ke senarai kod seterusnya, kita melihat output selepas itu yang memberitahu kita bahawa perbandingan persamaan dilakukan sepenuhnya berdasarkan identiti dan bukan pada kandungan.

Main.java Itu Ujian sama dengan () Pelaksanaan

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 dikehendaki di sini. Sebagai gantinya, pelaksanaan yang sama dan eksplisit diperlukan. Saya menyukai kenyataan bahawa anotasi Lombok untuk ini, @EqualsAndHashCode, hanya menghasilkan kedua-duanya bersama-sama kerana tidak masuk akal untuk mengatasinya secara eksplisit secara individu. Penyenaraian kelas Person.java ditunjukkan seterusnya dengan penambahan 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; } 

Keluarannya lebih baik sekarang.

Saya masih tidak mempunyai cara yang baik untuk mengakses setiap medan awam secara berasingan jika diperlukan. Sebagai contoh, jika saya ingin melakukan sesuatu dalam kod saya berdasarkan nama belakang, saya tidak mempunyai cara yang baik untuk melakukannya tanpa mengambil langkah drastik. Saya boleh menggunakan Lombok di sini lagi.

Untuk contoh ini, kita akan menganggap bahawa kita membuat anggapan yang salah bahawa hanya nama belakang orang yang boleh berubah. Oleh kerana anggapan ini, kami hanya akan memberikan anotasi Lombok @Setter untuk nama belakang, tetapi memberikan anotasi @Getter untuk kedua-dua bidang. Kod Orang yang berubah ditunjukkan seterusnya.

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 dikemas kini untuk menjalankan contoh ini:

Main.java yang Menggunakan Pengatur / Pengambil 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 terpaksa mengulas panggilan untuk menetapkan nama depan Orang supaya kodnya dapat dibina. Sekarang berjalan seperti yang ditunjukkan dalam tangkapan skrin seterusnya.

Ada kemungkinan koleksi anotasi Lombok ini biasanya diinginkan, terutama untuk kelas berorientasikan data. Atas sebab ini, Project Lombok menyediakan anotasi gabungan seperti @Data yang menyediakan koleksi anotasi ini. Dalam kes ini, saya mungkin mempunyai tingkah laku yang sangat serupa dengan beberapa anotasi individu yang saya berikan dengan menggunakan @Data. Anotasi @Data membawa ke Lombok menerapkan @Getter ke semua bidang dan @Setter ke semua bidang bukan akhir. Perbezaan utama lain dari apa yang saya gunakan ialah ia menggunakan @RequiredArgsConstructor dan bukannya @AllArgsConstructor.

Salah satu kaedah terbaik untuk melihat apa yang dilakukan oleh Project Lombok pada fail .class yang disusun adalah dengan menggunakan javap. Ini ditunjukkan dalam tangkapan skrin seterusnya.

Kami melihat dalam output ini bahawa sebilangan besar kaedah yang sering dilihat kod boilerplate terdapat di Person.class yang disusun. Terdapat konstruktor parameter dua argumen, hashCode (), sama dengan (Object), toString (), dan kaedah get and set yang diharapkan.

Projek Lombok bukan tanpa kebimbangan dan batasan. Sebilangan besar ini diartikulasikan sebagai respons terhadap posting Hamlet D'Arcy Java Without the Boilerplate - Project Lombok. Satu batasan adalah sokongan yang dikurangkan dalam IDE selain Eclipse (walaupun ada sokongan NetBeans yang layak dan javac disokong). Yang menjadi perhatian adalah perlunya orang lain menggunakan dan memelihara kod tersebut untuk memiliki ketergantungan baru pada Lombok. Keprihatinan ini dapat dikurangkan melalui penggunaan delombok, yang dapat digunakan dalam proses membangun jika perlu.

Artikel lain dan catatan blog yang merangkumi Project Lombok termasuk Project Lombok - Jangan Pernah Menulis Code Java Boilerplate Lagi, Java Tanpa Boilerplate - Project Lombok, Project Lombok: Bye Bye Boilerplate, Project Pombe Java Posse, Wawancara Project Lombok: Mengakhiri Verbosity Java , Project Lombok - Yang Harus Dimiliki dalam Toolkit Java Anda, Project Lombok: Pintasan Kacang Menarik dengan Pemrosesan Anotasi, Temu ramah: Reinier dan Roel di Lombok, Mengurangkan Kod Boilerplate dengan Project Lombok, Pengembangan Cepat dengan Lombok, Lombok Mengurangkan Kod Boilerplate Anda, dan Alternatif yang Lebih Baik untuk Pemula dan Pengawal.

Kisah ini, "Common Java Object Functionality with Project Lombok" pada awalnya diterbitkan oleh JavaWorld.