Rumah > Java > javaTutorial > Mengapakah Pembolehubah dalam Ungkapan Lambda Mesti Muktamad atau Berkesan Akhir?

Mengapakah Pembolehubah dalam Ungkapan Lambda Mesti Muktamad atau Berkesan Akhir?

Susan Sarandon
Lepaskan: 2024-12-22 21:00:13
asal
617 orang telah melayarinya

Why Must Variables in Lambda Expressions Be Final or Effectively Final?

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;
}
Salin selepas log masuk

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) {
    // ...
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan