Rumah >Java >javaTutorial >Mengapakah Java Memerlukan Pembolehubah dalam Ungkapan Lambda untuk Menjadi Akhir atau Berkesan Akhir?
Membetulkan "Pembolehubah yang digunakan dalam ungkapan lambda hendaklah muktamad atau berkesan muktamad" Ralat
Ralat ini berlaku apabila cuba mengakses bukan muktamad pembolehubah dalam ungkapan lambda. Untuk menyelesaikannya, pembolehubah mesti diisytiharkan muktamad atau muktamad secara berkesan.
Kemuktamadan Berkesan
Kemuktamadan berkesan bermakna pembolehubah tidak boleh ditugaskan semula selepas dimulakan. Ini boleh dicapai dengan:
Mengapa ini dikuatkuasakan?
Spesifikasi Bahasa Java (JLS) menyatakan bahawa "sekatan kepada pembolehubah muktamad secara berkesan melarang akses kepada pembolehubah tempatan yang berubah secara dinamik, yang penangkapannya mungkin akan menimbulkan masalah serentak." Dengan menguatkuasakan ini, Java menghalang kemungkinan ketidakkonsistenan data dan isu penjalinan.
Contoh
Pertimbangkan kod berikut:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { try { cal.getComponents().getComponents("VTIMEZONE").forEach(component -> { VTimeZone v = (VTimeZone) component; v.getTimeZoneId(); if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } }); } catch (Exception e) { log.warn("Unable to determine ical timezone", e); } return null; }
Pembolehubah calTz ialah tidak diisytiharkan muktamad, membawa kepada ralat. Untuk membetulkannya, kami boleh mengubah suai kod seperti berikut:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) { ... }
Sebagai alternatif, kami boleh memastikan calTz hanya diperuntukkan sekali dalam lambda:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { ... if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } ... }
Pertimbangan Tambahan
Keperluan ini juga terpakai kepada kelas dalaman tanpa nama. Sebagai contoh, kod berikut juga akan menyebabkan ralat:
new Thread(() -> { int i = 0; // Effectively final as it's only assigned once i++; // Error: cannot mutate effectively final variable }).start();
Dengan menguatkuasakan peraturan ini, Java membantu menghalang potensi pepijat dan menggalakkan keselamatan serentak dalam aplikasi berbilang benang.
Atas ialah kandungan terperinci Mengapakah Java Memerlukan Pembolehubah dalam Ungkapan Lambda untuk Menjadi Akhir atau Berkesan Akhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!