Apakah ada alasan performa untuk mendeklarasikan parameter metode final di Java?
Seperti dalam:
public void foo(int bar) { ... }
Melawan:
public void foo(final int bar) { ... }
Berasumsi bahwa bar
hanya dibaca dan tidak pernah diubah dalam foo()
.
java
performance
final
Tidur
sumber
sumber
Jawaban:
Kata kunci terakhir tidak muncul di file kelas untuk variabel dan parameter lokal, sehingga tidak dapat memengaruhi kinerja runtime. Ini hanya digunakan untuk memperjelas maksud pembuat kode bahwa variabel tidak diubah (yang oleh banyak orang dianggap sebagai alasan yang meragukan untuk penggunaannya), dan berurusan dengan kelas dalam anonim.
Ada banyak argumen mengenai apakah pengubah terakhir pada metode itu sendiri memiliki perolehan performa karena metode tersebut akan dimasukkan oleh compiler pengoptimalan pada waktu proses, terlepas dari pengubahnya. Dalam kasus ini, metode ini juga hanya boleh digunakan untuk membatasi penggantian metode.
sumber
Satu-satunya keuntungan parameter akhir adalah dapat digunakan dalam kelas bertingkat anonim. Jika sebuah parameter tidak pernah diubah, kompilator akan mendeteksi itu sebagai bagian dari operasi normalnya bahkan tanpa pengubah terakhir. Sangat jarang bahwa bug disebabkan oleh parameter yang ditetapkan secara tidak terduga - jika metode Anda cukup besar untuk memerlukan tingkat teknik ini, buat lebih kecil - metode yang Anda panggil tidak dapat mengubah parameter Anda.
sumber
Kompiler yang beroperasi setelah pemuatan kelas, seperti kompiler JIT, dapat memanfaatkan metode akhir. Akibatnya, metode yang dinyatakan final dapat memiliki beberapa manfaat kinerja.
http://www.javaperformancetuning.com/tips/final.shtml
Oh dan sumber daya bagus lainnya
http://mindprod.com/jgloss/final.html
sumber
Satu hal lagi di atas yang menggunakan variabel lokal non-final yang dideklarasikan dalam metode — instance kelas dalam mungkin hidup lebih lama dari frame tumpukan, sehingga variabel lokal mungkin menghilang saat objek dalam masih hidup
sumber
Saya berasumsi kompilator mungkin bisa menghapus semua variabel final statis pribadi yang memiliki tipe primitif, seperti int, dan menyebariskannya langsung dalam kode seperti dengan makro C ++.
Namun, saya tidak tahu apakah ini dilakukan dalam praktik, tetapi itu bisa dilakukan untuk menghemat memori.
sumber