Rumah >Java >javaTutorial >Mengapakah Java Memerlukan Pembolehubah dalam Ungkapan Lambda untuk Menjadi Akhir atau Berkesan Akhir?

Mengapakah Java Memerlukan Pembolehubah dalam Ungkapan Lambda untuk Menjadi Akhir atau Berkesan Akhir?

Patricia Arquette
Patricia Arquetteasal
2025-01-02 14:53:40557semak imbas

Why Does Java Require Variables in Lambda Expressions to Be Final or Effectively Final?

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:

  • Mengisytiharkan pembolehubah sebagai muktamad dalam skop luar
  • Memastikan pembolehubah hanya diberikan sekali dalam lambda

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!

Kenyataan:
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 sebelumnya:HARI Dis19Artikel seterusnya:HARI Dis19