Pembangun atau konstruktor? Kami bernalar dengan lantang

Halo! Saya ingin berspekulasi tentang kelayakan menggunakan pembangun untuk objek sederhana.



Untuk mempermudah, saya akan menggunakan anotasi lombok'a:



@Value

@Builder



Setelah sedikit googling, kita mendapatkan pembangun itu - Memisahkan konstruksi objek kompleks dari presentasinya sehingga sebagai hasil dari proses konstruksi yang sama, pandangan yang berbeda dapat diperoleh. Apakah hanya untuk objek yang kompleks?



Mari kita lihat contoh sederhana:



@Value
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}


Kelas yang cukup sederhana. Faktanya, kita mendapatkan objek tetap yang diinisialisasi melalui konstruktor.



Namun, seperti yang bisa kita lihat, semua bidang dapat dinihilkan, dan membuat objek seperti itu tidak akan terlihat bagus:



        final Info info1 = new Info(null, "email@email.com", "79998888888");
        final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null);
        final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null);
...


Ada pilihan pasti:



  1. Objek dengan beberapa bidang dari jenis yang berbeda dapat dikirimkan dengan beberapa konstruktor. Tapi itu tidak menyelesaikan masalah kelas di atas.
  2. Menggunakan penyetel bersifat subjektif, itu mengacaukan kode.




Bagaimana dengan pembangunnya?



@Value
@Builder
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}


Kami mendapatkan konstruksi objek sederhana yang sangat elegan :



        final Info info1 = Info.builder()
                .uuid("3d107928-d225-11ea-87d0-0242ac130003")
                .phone("79998888888")
                .build();
        final Info2 info2 = Info.builder()
                .email("email@email.com")
                .phone("79998888888")
                .build();
...
}


Namun, untuk menggunakan jackson dalam proyek, perlu untuk melengkapi kelas kita agar berhasil deserialisasi:



@Value
@Builder(builderClassName = "InfoBuilder")
@JsonDeserialize(builder = Info.InfoBuilder.class)
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;

    @JsonPOJOBuilder(withPrefix = "")
    public static class InfoBuilder {

    }
}


Kami mendapatkan pro dan kontra untuk kedua pendekatan:



pembangun:



+

1. Kode menjadi lebih ringkas.

3. Nol dalam parameter konstruktor tidak mencolok.

2. Lebih sedikit kemungkinan membingungkan parameter dari jenis yang sama.

-

1. Kami membuat objek tambahan yang akan dihapus oleh GC secara keseluruhan, tetapi Anda tidak boleh melupakannya.

2. Jika perlu, gunakan jackson - kumpulkan kelas.



konstruktor:



+

1. Menumpuk minimal kelas kita, tidak ada air.

2. Tidak ada pembuatan objek yang tidak perlu.

-

1. Sangat sering null akan tiba di konstruktor objek seperti itu.

2. Mungkin saja membuat kesalahan saat seseorang mengubah kode.



Hasil



Berdasarkan pengalaman saya, saya cenderung menggunakan builder. Biayanya tidak tinggi, tetapi hasilnya adalah kode yang enak dibaca.



Dan tentu saja, tulis tes untuk menghindari poin negatif ke-2 menggunakan konstruktor.



PS Ini adalah artikel pertama saya, saya akan berterima kasih atas kritik dan komentar yang membangun.



All Articles