Katakanlah saya memiliki kelas beranotasi lombok seperti
@Builder
class Band {
String name;
String type;
}
Saya tahu saya bisa melakukan:
Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();
Apakah ada cara mudah untuk membuat objek Foo menggunakan objek yang ada sebagai templat dan mengubah salah satu propertinya?
Sesuatu seperti:
Band nirvana = Band.builder(rollingStones).name("Nirvana");
Saya tidak bisa menemukan ini di dokumentasi lombok.
@Wither
, yang lebih efisien untuk perubahan field:Foo f1 = f0.withX(42)
.@Wither
menghasilkan dengan * metode yang selalu mengembalikan objek baru, bukan pengaturan bidang objek yang ada. Ini efisiensi rendah.@Wither
yang terbaik. Fot lebih dari dua,toBuilder
menang. Lihat jawaban saya di bawah.@Wither
tidak akan berfungsi sama sekali tetapi.toBuilder().build()
akan berfungsi .Jika Anda benar-benar ingin mengubah satu properti, ada cara yang lebih baik dan lebih efisien:
@With class Band { String name; String type; } Band nirvana = rollingStones.withName("Nirvana");
The layu tidak menghasilkan sampah, tetapi dapat mengubah hanya satu bidang. Untuk mengubah banyak bidang, Anda bisa menggunakan
dan menghasilkan berton-ton sampah (semua hasil antara) tetapi
toBuilder
lebih efisien dan lebih alami.CATATAN: Versi lombok yang lebih lama telah menggunakan
@Wither
anotasi. Lihat awal dokumentasi .sumber
n-1
objek untuk serangkaiann
panggilanwithSomething
. Sebuah objek berharga seperti beberapa byte ditambah 4 atau 8 byte per referensi ditambah 1 hingga 8 byte per primitif. Jadi kita berbicara tentang puluhan byte per panggilan. Biasanya bukan masalah besar.