Menggunakan Anotasi @Builder Lombok

1. Gambaran keseluruhan

Project Lombok's @Builder adalah mekanisme yang berguna untuk menggunakan corak Builder tanpa menulis kod boilerplate. Kami boleh menerapkan anotasi ini ke Kelas atau kaedah.

Dalam tutorial ringkas ini, kita akan melihat pelbagai kes penggunaan untuk @Builder .

2. Pergantungan Maven

Pertama, kita perlu menambahkan Project Lombok ke pom.xml kami :

 org.projectlombok lombok 1.18.10 

Maven Central mempunyai versi terbaru Project Lombok di sini.

3. Menggunakan @Builder di Kelas

Dalam kes penggunaan pertama, kami hanya melaksanakan Kelas , dan kami ingin menggunakan pembangun untuk membuat contoh kelas kami.

Langkah pertama dan satu-satunya ialah menambahkan anotasi pada pengisytiharan kelas:

@Getter @Builder public class Widget { private final String name; private final int id; } 

Lombok melakukan semua kerja untuk kita. Kita sekarang boleh membina Widget dan mengujinya:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); assertThat(testWidget.getName()) .isEqualTo("foo"); assertThat(testWidget.getId()) .isEqualTo(1);

Sekiranya kita ingin membuat salinan atau salinan hampir objek, kita dapat menambahkan properti keBuilder = true pada anotasi @Builder :

@Builder(toBuilder = true) public class Widget { //... }

Ini memberitahu Lombok untuk menambahkan kaedah toBuilder () ke Kelas kami . Apabila kita menggunakan kaedah toBuilder () , ia mengembalikan pembangun yang diinisialisasi dengan sifat instance yang dipanggil:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder(); Widget newWidget = widgetBuilder.id(2).build(); assertThat(newWidget.getName()) .isEqualTo("foo"); assertThat(newWidget.getId()) .isEqualTo(2);

Kita dapat melihat dalam kod ujian bahawa kelas pembangun yang dihasilkan oleh Lombok dinamakan seperti kelas kita, dengan "Builder" ditambahkan padanya - WidgetBuilder dalam kes ini. Kita kemudian dapat mengubah sifat yang kita inginkan dan membina () contoh baru.

Sekiranya kita perlu menentukan bidang yang diperlukan, kita dapat menggunakan konfigurasi anotasi untuk membuat pembina tambahan:

@Builder(builderMethodName = "internalBuilder") public class RequiredFieldAnnotation { @NonNull private String name; private String description; public static RequiredFieldAnnotationBuilder builder(String name) { return internalBuilder().name(name); } }

Dalam kes ini, kita bersembunyi lalai pembina sebagai internalBuilder dan mewujudkan kita sendiri. Oleh itu, apabila kita membuat pembangun, kita mesti memberikan parameter yang diperlukan:

RequiredField.builder("NameField").description("Field Description").build();

Juga, untuk memastikan bidang kami wujud, kami dapat menambahkan anotasi @NonNull .

4. Menggunakan @Builder pada Kaedah

Katakan kita menggunakan objek yang ingin kita bina dengan pembangun, tetapi kita tidak dapat mengubah sumber atau memperluas Kelas .

Pertama, mari buat contoh ringkas dengan menggunakan anotasi @Value Lombok:

@Value final class ImmutableClient { private int id; private String name; }

Sekarang kita mempunyai Kelas terakhir dengan dua ahli yang tidak berubah, pemenang untuk mereka, dan pembina semua argumen.

Kami merangkumi cara menggunakan @Builder di Kelas , tetapi kami juga boleh menggunakannya dalam kaedah. Kami akan menggunakan kemampuan ini untuk mengatasi tidak dapat mengubah atau memperluas ImmutableClient .

Seterusnya, kami akan membuat kelas baru dengan kaedah untuk membuat ImmutableClients:

class ClientBuilder { @Builder(builderMethodName = "builder") public static ImmutableClient newClient(int id, String name) { return new ImmutableClient(id, name); } }

Anotasi ini membuat kaedah bernama builder () yang mengembalikan Builder untuk membuat ImmutableClients .

Sekarang, mari membina Pelanggan yang Tidak Berubah :

ImmutableClient testImmutableClient = ClientBuilder.builder() .name("foo") .id(1) .build(); assertThat(testImmutableClient.getName()) .isEqualTo("foo"); assertThat(testImmutableClient.getId()) .isEqualTo(1);

5. Kesimpulan

Dalam artikel ini, kami menggunakan anotasi @Builder Lombok mengenai kaedah untuk membuat pembangun untuk Kelas akhir , dan kami melihat bagaimana membuat beberapa medan Kelas diperlukan.

Contoh kod, seperti biasa, boleh didapati di GitHub.