Java memungkinkan penandaan variabel (bidang / lokal / parameter) sebagai final
, untuk mencegah penugasan kembali ke dalamnya. Saya merasa sangat berguna dengan bidang, karena membantu saya dengan cepat melihat apakah beberapa atribut - atau seluruh kelas - dimaksudkan untuk tidak berubah.
Di sisi lain, saya merasa itu jauh kurang berguna dengan penduduk lokal dan parameter, dan biasanya saya menghindari menandai mereka final
bahkan jika mereka tidak akan pernah ditugaskan kembali (dengan pengecualian yang jelas ketika mereka perlu digunakan di kelas dalam) . Akhir-akhir ini, bagaimanapun, saya telah menemukan kode yang digunakan final kapan saja bisa, yang saya kira secara teknis memberikan lebih banyak informasi.
Tidak lagi yakin dengan gaya pemrograman saya, saya bertanya-tanya apa kelebihan dan kekurangan lain dari penerapan di final
mana saja, apa gaya industri yang paling umum, dan mengapa.
final
atau tidak, dan dioptimalkan sesuai. Kompiler modern cukup pintar untuk mengetahuinya sendiri. Setidaknya pada variabel lokal,final
hanya untuk kepentingan pembaca manusia. Jika rutinitas Anda tidak terlalu rumit, maka kebanyakan pembaca manusia harus bisa mengetahuinya sendiri juga.Jawaban:
Saya menggunakan
final
cara yang sama seperti Anda. Bagi saya itu terlihat berlebihan pada variabel lokal dan parameter metode, dan itu tidak menyampaikan informasi tambahan yang berguna.Satu hal penting adalah berusaha untuk menjaga metode saya pendek dan bersih , masing-masing melakukan satu tugas. Jadi variabel dan parameter lokal saya memiliki cakupan yang sangat terbatas, dan hanya digunakan untuk satu tujuan. Ini meminimalkan kemungkinan penugasan kembali secara tidak sengaja.
Selain itu, seperti yang Anda pasti tahu,
final
tidak menjamin bahwa Anda tidak dapat mengubah nilai / keadaan variabel (tidak bernilai). Hanya bahwa Anda tidak dapat menetapkan kembali referensi ke objek yang pernah diinisialisasi. Dengan kata lain, ia bekerja dengan mulus hanya dengan variabel tipe primitif atau tidak berubah. MempertimbangkanIni berarti bahwa dalam banyak kasus masih tidak membuatnya lebih mudah untuk memahami apa yang terjadi di dalam kode, dan kesalahpahaman ini sebenarnya dapat menyebabkan bug halus yang sulit dideteksi.
sumber
final
, terima kasih :) tapi poin bagus tentang metode pendek & bersih - Saya kira jika metode ini cukup pendek sehingga jelas variabel tidak ditugaskan ulang, ada motif yang kurang untuk mempertimbangkanfinal
kata kunci.Gaya dan pemikiran pemrograman Java Anda baik-baik saja - tidak perlu meragukan diri Anda di sana.
Inilah mengapa Anda harus menggunakan
final
kata kunci. Anda menyatakan bahwa ANDA tahu itu tidak akan pernah ditugaskan kembali, tetapi tidak ada orang lain yang tahu itu. Menggunakanfinal
segera melemahkan kode Anda yang sedikit lebih.sumber
final
menyatakan, yang membuat kode lebih mudah dibaca. Juga, begitu Anda harus berurusan dengan kode dunia nyata, Anda akan melihat itu jarang asli dan jelas, dan secara bebas menambahkanfinal
di mana pun Anda bisa akan membantu Anda menemukan bug dan memahami kode lama dengan lebih baik.final
menyatakan niat, yang biasanya merupakan hal yang baik dalam sepotong kode, tetapi harganya harus ditambah dengan kekacauan visual. Seperti kebanyakan hal dalam pemrograman, ada untung-ruginya di sini: apakah mengungkapkan fakta bahwa variabel Anda hanya akan digunakan hanya satu kali sepadan dengan kata kerja tambahan?final
. Itu mungkin sebagian besar penduduk setempat, tetapi jelas tidak semua . Bagi saya tidak ada "kebetulan tidak pernah berubah". Ada 2 jenis penduduk setempat yang jelas terpisah di dunia saya. Mereka yang tidak pernah seharusnya berubah lagi (final) dan yang harus berubah sebagai akibat dari apa yang dikerjakan oleh tugas (yang jumlahnya sangat sedikit, membuat fungsinya cukup mudah untuk dipikirkan).Salah satu keuntungan menggunakan
final
/const
sedapat mungkin adalah mengurangi beban mental bagi pembaca kode Anda.Dia dapat yakin, bahwa nilai / referensi tidak pernah diubah nanti. Jadi dia tidak perlu memperhatikan modifikasi untuk memahami perhitungannya.
Saya telah berubah pikiran mengenai hal ini setelah mempelajari bahasa pemrograman murni-fungsional. Boy, betapa meringankannya, jika Anda bisa mempercayai "variabel" untuk selalu memegang nilai awalnya.
sumber
final
tidak menjamin bahwa Anda tidak dapat mengubah nilai / status variabel (tidak bernilai). Hanya bahwa Anda tidak dapat menetapkan kembali referensi ke objek yang pernah diinisialisasi.Saya menganggap
final
dalam parameter metode dan variabel lokal menjadi noise kode. Deklarasi metode Java bisa sangat panjang (terutama dengan obat generik) - tidak perlu membuatnya lagi.Jika unit test ditulis dengan benar, menugaskan ke parameter yang "berbahaya" akan diambil, jadi seharusnya tidak pernah benar - benar menjadi masalah. Kejelasan visual lebih penting daripada menghindari kemungkinan bug yang tidak diambil karena unit test Anda memiliki cakupan yang tidak memadai.
Alat-alat seperti FindBugs dan CheckStyle yang dapat dikonfigurasikan untuk memecah bangunan jika tugas dibuat untuk parameter atau variabel lokal, jika Anda sangat peduli tentang hal-hal seperti itu.
Tentu saja, jika Anda perlu membuatnya final, misalnya karena Anda menggunakan nilai dalam kelas anonim, maka tidak ada masalah - itu solusi paling sederhana yang paling bersih.
Terlepas dari efek yang jelas dari menambahkan kata kunci tambahan ke parameter Anda, dan dengan demikian IMHO menyamarkannya, menambahkan parameter akhir ke metode sering dapat membuat kode dalam tubuh metode menjadi kurang mudah dibaca, yang membuat kode lebih buruk - menjadi "baik", kode harus mudah dibaca dan sesederhana mungkin. Sebagai contoh buat-buat, katakan saya punya metode yang perlu bekerja kasus tidak sensitif.
Tanpa
final
:Sederhana. Bersih. Semua orang tahu apa yang terjadi.
Sekarang dengan 'final', opsi 1:
Sementara membuat parameter
final
menghentikan kode menambahkan kode lebih jauh ke bawah dari berpikir dia bekerja dengan nilai asli, ada risiko yang sama bahwa kode lebih lanjut dapat menggunakaninput
alih-alihlowercaseInput
, yang seharusnya tidak dan yang tidak dapat dilindungi, karena Anda bisa ' t membawanya keluar dari ruang lingkup (atau bahkan menetapkannull
untukinput
jika itu bahkan akan membantu pula).Dengan 'final', opsi 2:
Sekarang kami baru saja membuat lebih banyak noise kode dan memperkenalkan performa yang baik karena harus meminta
toLowerCase()
n kali.Dengan 'final', opsi 3:
Bicara tentang kebisingan kode. Ini adalah kecelakaan kereta api. Kami punya metode baru, blok pengecualian yang diperlukan, karena kode lain mungkin salah memanggilnya. Lebih banyak unit test untuk mencakup pengecualian. Semua untuk menghindari satu garis sederhana, dan IMHO lebih disukai dan tidak berbahaya.
Ada juga masalah bahwa metode tidak boleh terlalu lama sehingga Anda tidak dapat dengan mudah menerimanya secara visual dan mengetahui sekilas bahwa penugasan ke parameter telah terjadi.
Saya pikir itu adalah praktik / gaya yang baik bahwa jika Anda menetapkan ke parameter Anda melakukannya setiap awal dalam metode, lebih disukai baris pertama atau langsung setelah pengecekan input dasar, secara efektif menggantikannya untuk seluruh metode, yang memiliki efek konsisten dalam metode. Pembaca tahu untuk mengharapkan penugasan apa pun menjadi jelas (dekat deklarasi tanda tangan) dan di tempat yang konsisten, yang sangat memitigasi masalah yang ingin dihindari dengan menambahkan tugas akhir. Sebenarnya saya jarang menetapkan parameter, tetapi jika saya melakukannya saya selalu melakukannya di bagian atas metode.
Perhatikan juga bahwa
final
sebenarnya tidak melindungi Anda seperti itu mungkin pada awalnya tampak:final
tidak sepenuhnya melindungi Anda kecuali tipe parameternya primitif atau tidak dapat diubah.sumber
final
apakah memberikan jaminan parsial bahwa Anda berurusan denganDate
contoh yang sama . Beberapa jaminan lebih baik daripada tidak sama sekali (jika ada, Anda memperdebatkan kelas yang tidak dapat diubah dari awal!). Bagaimanapun, dalam praktiknya banyak dari apa yang Anda katakan harus memengaruhi bahasa-bahasa default yang ada yang tidak dapat diubah tetapi tidak, yang berarti itu bukan masalah.final
, dengan kemungkinan untuk membuatnya tidak final untuk kasus-kasus seperti di atas. Hanya saja tidak layak untuk mengirim tanda tangan dengan kata kunci.input
daripadalowercaseInput
moot. Meskipun secara teknis benar, kesalahan itu mudah dikenali begitu ia menyebabkan Anda bug, karena Anda dapat dengan jelas melihat perbedaan semantik dari 2 variabel yang dinamai secara terpisah pada titik penggunaannya (asalkan Anda memberi mereka nama baik). Bagi saya, itu lebih berbahaya untuk mengacaukan 2 penggunaan yang berbeda secara semantik dari nilai-nilai yang terpisah menjadi variabel yang sama dan oleh karena itu nama yang sama. Ini dapat membuat pelacakan bug lebih sulit, karena Anda harus membaca dan memahami semua kode sebelumnya yang entah bagaimana terkait dengan variabel 1.Saya membiarkan eclipse diletakkan di
final
depan setiap variabel lokal, karena saya menganggapnya membuat program lebih mudah dibaca. Saya tidak membuatnya dengan parameter, karena saya ingin menyimpan daftar parameter sesingkat mungkin, idealnya harus sesuai dalam satu baris.sumber
var
untuk menandai variabel non-final. YMMV.var
! Sayangnya itu bukan default di Java dan sekarang sudah terlambat untuk mengubah bahasa. Karena itu, saya bersedia menerima ketidaknyamanan menulis yang kecilfinal
:)final
kata kunci yang diawali, sedangkan hanya 10-20% akan membutuhkanvar
...