Karena saya bekerja pada server yang sama sekali tidak memiliki status non-persisten untuk pengguna, setiap objek terkait Pengguna yang kami miliki diluncurkan pada setiap permintaan.
Akibatnya saya sering menemukan diri saya melakukan inisialisasi malas dari properti objek yang mungkin tidak digunakan.
protected EventDispatcher dispatcher = new EventDispatcher();
Menjadi...
protected EventDispatcher<EventMessage> dispatcher;
public EventDispatcher<EventMessage> getEventDispatcher() {
if (dispatcher == null) {
dispatcher = new EventDispatcher<EventMessage>();
}
return dispatcher;
}
Apakah ada alasan ini tidak dapat dibangun ke Jawa?
protected lazy EventDispatcher dispatcher = new EventDispatcher();
Seperti yang disebutkan di bawah dalam komentar, saya menyadari bahwa bahasa secara teori dapat berevolusi untuk memasukkan sebagian besar apa pun yang Anda inginkan. Saya mencari ukuran praktis dari kemungkinan. Apakah ini akan bertentangan dengan fitur lain? Apakah implementasinya cukup sederhana untuk bekerja dengan baik dengan JVM seperti yang ada? Dan bahkan, apakah itu ide yang bagus?
synchronized
kata kunci akan bekerja sama seperti jika itu pada metode. Saya membayangkan akan ada beberapa akomodasi metode konstruksi yang lebih rumit. Dalam kasus penggunaan khusus saya , karena sifat masalahnya, dengan setiap permintaan sebagai dunianya sendiri, sinkronisasi tidak ada gunanya.Jawaban:
Ini jawaban delapan halaman untuk pertanyaan Anda: http://tinlizzie.org/~awarth/papers/fool07.pdf
Jika saya dapat mencoba dan meringkas masalah secara kasar dengan menambahkan kemalasan, ini adalah kasus sudut. Ada banyak peringatan di sekitar efek samping. Pertimbangkan, dalam contoh Anda, jika konstruktor memiliki efek samping yang terlihat seperti menabrak penghitung global atau melakukan I / O ... Sulit untuk memikirkan kapan itu akan terjadi. Atau pertimbangkan efek samping yang bahkan lebih buruk tentang pengecualian (mereka dilemparkan ... ketika Anda merujuk objek malas?)
Langsung saja ke bagian 6 di kertas di atas. (Dan kagumi semua logika formal tipe sistem pada halaman yang Anda lewati ...)
sumber
Tentu saja sangat mungkin. Bahkan, scala sudah memiliki fitur ini! (Scala adalah bahasa JVM dan dikompilasi ke bytecode). Berikut ini adalah sumber skala:
Dan inilah bentuk peralihan dari kode yang dikompilasi:
}
sumber
Saya pikir Anda pertama-tama perlu menambahkan properti nyata ke langauge Java, daripada mengandalkan idiom getX / setX. Dengan begitu Anda bisa menandai properti sebagai malas (dan disinkronkan, hanya baca dll ...).
Semacam apa yang diminta di sini (Objective-C, tetapi konsep berlaku).
sumber
Tentu saja ini dapat ditambahkan ke Jawa, kata kunci lazy dapat diimplementasikan sebagai gula sintaksis. Namun, apakah itu akan dilaksanakan tergantung pada visi pembangun kompiler.
sumber