Lambdas dan Skop Pembolehubah: Mengapa Pembolehubah Tempatan Memerlukan Kemuktamadan
Perbezaan yang menarik timbul apabila bekerja dengan lambda di Java: pembolehubah tempatan mesti diisytiharkan sebagai muktamad, manakala pembolehubah contoh tidak. Untuk merungkai enigma ini, mari kita mendalami perbezaan asas dalam tingkah laku mereka.
Mutability of Fields vs. Local Variable
Perbezaan utama antara medan dan pembolehubah tempatan terletak pada kebolehubahan mereka. Medan, juga dikenali sebagai pembolehubah contoh, berada dalam contoh objek dan boleh diubah suai secara dinamik. Sebaliknya, pembolehubah tempatan disimpan pada timbunan JVM dan nilainya tidak boleh diubah selepas pemulaan.
Gelagat Lambda
Apabila mentakrifkan ungkapan lambda, pengkompil menjana kelas tanpa nama yang melaksanakan antara muka berfungsi. Kelas ini merangkum kod lambda dan mempunyai pembina sintetik yang memulakan sebarang pembolehubah tempatan yang dihantar kepada lambda.
Kehabisan Pembolehubah Tempatan
Yang penting, pembolehubah tempatan ini dalam kelas tanpa nama lambda dimulakan dengan menyalin nilainya daripada konteks sekeliling. Ini bermakna bahawa nilainya tidak boleh diubah suai dalam lambda, kerana salinan asal kekal tidak berubah dalam konteks pemanggil. Untuk mengelakkan kemungkinan ralat, pengkompil menguatkuasakan kata kunci akhir untuk pembolehubah tempatan dalam lambdas.
Pembolehubah Contoh Tidak Diubahsuai
Pembolehubah tika, sebaliknya, tidak dipengaruhi oleh sekatan yang sama. Ini kerana perubahan yang dibuat kepada pembolehubah contoh dalam kelas tanpa nama lambda disebarkan kembali kepada contoh objek. Akibatnya, skop mereka melangkaui konteks pelaksanaan lambda, menghapuskan keperluan untuk muktamad.
Kesimpulan
Perbezaan antara pembolehubah tempatan dan contoh dalam lambda bermuara kepada skopnya dan kebolehubahan. Pembolehubah setempat, dengan skop terkurungnya, memerlukan kemuktamadan untuk mengelakkan kerosakan pada konteks pemanggil, manakala pembolehubah contoh mengekalkan kedinamiannya disebabkan skopnya yang lebih luas melangkaui kitaran hayat lambda.
Atas ialah kandungan terperinci Mengapakah Lambdas di Java Memerlukan Pembolehubah Tempatan untuk Menjadi Akhir, tetapi Bukan Pembolehubah Instance?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!