Apa perbedaan yang final
membuat antara kode di bawah ini. Apakah ada keuntungan dalam mendeklarasikan argumen sebagai final
.
public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){
return ....
}
public String changeTimezone(final Timestamp stamp, final Timezone fTz,
final Timezone toTz){
return ....
}
Jawaban:
Karena parameter metode formal adalah variabel lokal, Anda dapat mengaksesnya dari kelas anonim dalam hanya jika dideklarasikan sebagai final.
Ini menyelamatkan Anda dari mendeklarasikan variabel final lokal lain di badan metode:
void m(final int param) { new Thread(new Runnable() { public void run() { System.err.println(param); } }).start(); }
sumber
Ekstrak dari Kata terakhir pada kata kunci terakhir
public void doSomething(final int i, final int j) { // cannot change the value of i or j here... // any change would be visible only inside the method... }
sumber
Yang terakhir mencegah Anda memberikan nilai baru ke variabel, dan ini dapat membantu dalam menangkap kesalahan ketik. Secara gaya Anda mungkin ingin menjaga parameter yang diterima tidak berubah dan hanya menetapkan ke variabel lokal, jadi final akan membantu untuk menegakkan gaya itu.
Harus saya akui saya jarang ingat untuk menggunakan final untuk parameter, mungkin saya harus.
public int example(final int basicRate){ int discountRate; discountRate = basicRate - 10; // ... lots of code here if ( isGoldCustomer ) { basicRate--; // typo, we intended to say discountRate--, final catches this } // ... more code here return discountRate; }
sumber
Itu tidak membuat banyak perbedaan. Itu hanya berarti Anda tidak dapat menulis:
stamp = null; fTz = new ...;
tetapi Anda masih bisa menulis:
Ini terutama merupakan petunjuk bagi programmer pemeliharaan yang mengikuti Anda bahwa Anda tidak akan memberikan nilai baru ke parameter di suatu tempat di tengah metode Anda di mana tidak jelas dan karena itu dapat menyebabkan kebingungan.
sumber
Kata kunci terakhir saat digunakan untuk parameter / variabel di Java menandai referensi sebagai final. Jika mengirimkan objek ke metode lain, sistem membuat salinan variabel referensi dan meneruskannya ke metode. Dengan menandai referensi baru sebagai final, Anda melindunginya dari penugasan ulang. Terkadang ini dianggap sebagai praktik pengkodean yang baik.
sumber
Untuk tubuh metode ini,
final
kata kunci akan mencegah referensi argumen tidak sengaja dipindahkan sehingga memberikan kesalahan kompilasi pada kasus tersebut (sebagian besar IDE akan langsung mengeluh). Beberapa orang mungkin berpendapat bahwa menggunakanfinal
secara umum jika memungkinkan akan mempercepat, tetapi itu tidak terjadi di JVM baru-baru ini.sumber
Dua keuntungan yang saya lihat tercantum:
1 Menandai argumen metode sebagai final mencegah penugasan ulang argumen di dalam metode
Dari contoh Anda
public String changeTimezone(final Timestamp stamp, final Timezone fTz, final Timezone toTz){ // THIS WILL CAUSE COMPILATION ERROR as fTz is marked as final argument fTz = Calendar.getInstance().getTimeZone(); return .. }
Dalam metode yang rumit, menandai argumen sebagai final akan membantu dalam interpretasi yang tidak disengaja dari argumen ini sebagai metode variabel lokal dan penugasan ulang sebagai kompilator akan menandai kasus ini seperti yang ditunjukkan dalam contoh.
2 Meneruskan argumen ke kelas dalam anonim
Karena parameter metode formal adalah variabel lokal, Anda dapat mengaksesnya dari kelas anonim dalam hanya jika dideklarasikan sebagai final.
sumber
- Dulu (sebelum Java 8 :-))
Jelaskan penggunaan kata kunci "akhir" yang memengaruhi aksesibilitas variabel metode untuk kelas anonim internal.
- Dalam bahasa modern (Java 8+) tidak diperlukan penggunaan seperti itu:
Java memperkenalkan variabel "efektif akhir". Variabel lokal dan parameter metode dianggap final jika kode tidak menyiratkan perubahan nilai variabel. Jadi jika Anda melihat kata kunci seperti itu di Java8 +, Anda dapat menganggapnya tidak perlu. Pengenalan "efektif akhir" membuat kita mengetik lebih sedikit kode saat menggunakan lambda.
sumber
Ini hanya sebuah konstruksi di Java untuk membantu Anda menentukan kontrak dan menaatinya. Diskusi serupa di sini: http://c2.com/cgi/wiki?JavaFinalConsideredEvil
BTW - (seperti yang dikatakan twiki), menandai args sebagai final umumnya berlebihan jika Anda mengikuti prinsip-prinsip pemrograman yang baik dan telah selesai menetapkan ulang / mendefinisikan ulang referensi argumen yang masuk.
Dalam kasus terburuk, jika Anda mendefinisikan ulang referensi args, ini tidak akan memengaruhi nilai sebenarnya yang diteruskan ke fungsi - karena hanya referensi yang diteruskan.
sumber
Saya berbicara tentang menandai variabel dan bidang akhir secara umum - tidak hanya berlaku untuk argumen metode. (Menandai metode / kelas akhir adalah hal yang sama sekali berbeda).
Ini membantu pembaca / pengelola masa depan kode Anda. Bersama dengan nama variabel yang masuk akal, sangat membantu dan meyakinkan pembaca kode Anda untuk melihat / memahami apa yang diwakili oleh variabel yang dimaksud - dan meyakinkan pembaca bahwa setiap kali Anda melihat variabel dalam ruang lingkup yang sama, artinya tetap ada. sama, jadi dia tidak perlu menggaruk-garuk kepalanya untuk selalu mencari tahu arti variabel dalam setiap konteks. Kami telah melihat terlalu banyak penyalahgunaan variabel "penggunaan kembali", yang bahkan membuat cuplikan kode pendek sulit untuk dipahami.
sumber
Kata kunci terakhir mencegah Anda menetapkan nilai baru ke parameter. Saya ingin menjelaskan ini dengan contoh sederhana
Misalkan kita punya metode
Dalam kasus di atas, jika "dateOfBirth" diberi nilai baru di method2 maka ini akan menghasilkan keluaran yang salah dari method3. Karena nilai yang diteruskan ke method3 tidak seperti sebelum diteruskan ke method2. Jadi untuk menghindari kata kunci terakhir ini digunakan untuk parameter.
Dan ini juga salah satu Praktik Terbaik Pengkodean Java.
sumber