Mengapa Pembolehubah Kekal Diperlukan dalam Ungkapan Lambda
Ralat "Pembolehubah yang digunakan dalam ungkapan lambda harus muktamad atau muktamad berkesan" timbul apabila pembolehubah yang digunakan dalam ungkapan lambda bukanlah muktamad atau muktamad berkesan. Untuk memahami keperluan ini, 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; }
Dalam kod ini, pembolehubah 'calTz' digunakan dalam ungkapan lambda yang berulang pada komponen objek Kalendar. Walau bagaimanapun, 'calTz' tidak diisytiharkan sebagai 'muktamad' dan tidak muktamad secara berkesan (iaitu, ia mungkin diubah suai kemudian dalam kod).
Mengikut Spesifikasi Bahasa Java (JLS) §15.27.2, pembolehubah yang ditangkap oleh ungkapan lambda mestilah muktamad dengan berkesan. Ini bermakna pembolehubah tidak boleh diubah suai selepas ia ditangkap oleh lambda. Sebab sekatan ini adalah untuk mengelakkan isu konkurensi yang boleh berlaku apabila berbilang rangkaian mengakses dan berpotensi mengubah suai pembolehubah yang ditangkap.
Untuk menyelesaikan ralat, anda boleh mengubah suai kod untuk memastikan pembolehubah 'calTz' adalah muktamad atau muktamad berkesan. Satu cara untuk melakukan ini ialah dengan mengisytiharkan 'calTz' sebagai muktamad:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) { // ... }
Sebagai alternatif, anda boleh membuat 'calTz' secara berkesan muktamad dengan memberikannya nilai serta-merta dan memastikan bahawa nilai itu tidak ditukar kemudian dalam kod:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal) { TimeZone calTz = null; try { // ... } catch (Exception e) { // ... } return calTz; }
Dengan mengikut keperluan bahawa pembolehubah yang digunakan dalam ungkapan lambda adalah muktamad atau berkesan muktamad, anda boleh mengelakkan kemungkinan isu konkurensi dan pastikan ketepatan kod anda.
Atas ialah kandungan terperinci Mengapakah Pembolehubah dalam Ungkapan Lambda Mesti Muktamad atau Berkesan Akhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!