saya ada kelas
@Value
@NonFinal
public class A {
int x;
int y;
}
Saya memiliki kelas B lain
@Value
public class B extends A {
int z;
}
lombok melempar kesalahan yang mengatakan tidak dapat menemukan konstruktor A (), secara eksplisit menyebutnya apa yang saya ingin lombok lakukan adalah memberikan anotasi ke kelas b sehingga menghasilkan kode berikut:
public class B extends A {
int z;
public B( int x, int y, int z) {
super( x , y );
this.z = z;
}
}
Apakah kami memiliki anotasi untuk melakukan itu di Lombok?
inConstructor
metode untuk penjelasan konstruktor di mana kita dapat menentukan konstruktor mana yangsuper
harus dimasukkan Lombok ke dalam konstruktor yang dihasilkan?Lombok Issue # 78 mereferensikan halaman ini https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ dengan penjelasan yang indah ini:
Saya juga menemukan ini berfungsi dengan baik dengan Spring Data JPA.
sumber
Lombok tidak mendukung itu juga ditunjukkan dengan membuat
@Value
kelas beranotasifinal
(seperti yang Anda ketahui dengan menggunakan@NonFinal
).Satu-satunya solusi yang saya temukan adalah mendeklarasikan semua anggota final sendiri dan menggunakan
@Data
anotasi sebagai gantinya. Subkelas tersebut perlu dianotasi oleh@EqualsAndHashCode
dan memerlukan konstruktor all args yang eksplisit karena Lombok tidak tahu cara membuatnya menggunakan kelas super all args:Terutama konstruktor dari subclass membuat solusi sedikit tidak rapi untuk superclass dengan banyak anggota, maaf.
sumber
@EqualsAndHashCode
"? Bukankah anotasi ini disertakan oleh@Data
? Thx :)@Data
juga membuat sama dengan () dan hashCode () tetapi tidak peduli tentang warisan apa pun. Untuk memastikan superclass sama dengan () dan hashCode () digunakan, Anda memerlukan generasi eksplisit dengan callSuperuntuk superclass dengan banyak anggota, saya sarankan Anda menggunakan @Delegate
sumber
@Delegate
adalah@Target({ElementType.FIELD, ElementType.METHOD})
.AInner
harus di lapanganA
.Jika kelas anak memiliki lebih banyak anggota, daripada orang tua, itu bisa dilakukan tidak terlalu bersih, tapi cara singkat:
sumber
Lombok versi 1.18 memperkenalkan anotasi @SuperBuilder. Kami dapat menggunakan ini untuk menyelesaikan masalah kami dengan cara yang lebih sederhana.
Anda dapat merujuk ke https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 .
jadi di kelas anak Anda, Anda akan membutuhkan anotasi ini:
di kelas orang tua Anda:
sumber
Sebagai opsi yang dapat Anda gunakan
com.fasterxml.jackson.databind.ObjectMapper
untuk menginisialisasi kelas anak dari orang tuaAnda tetap dapat menggunakan
lombok
anotasi apa pun pada A dan B jika perlu.sumber