Karena saya menemukan kekuatan final
kata kunci di Jawa beberapa tahun yang lalu, itu membantu saya untuk membuat kode saya lebih mudah dibaca, karena orang dapat dengan mudah melihat apa yang hanya variabel baca-saja. Ini juga dapat memberikan sedikit dorongan kepada JIT, dan meskipun itu sangat terbatas, JIT tidak dapat membahayakan, terutama ketika menargetkan perangkat yang disematkan seperti platform android.
Tetapi lebih dari segalanya, itu berkontribusi untuk membuat desain lebih kuat untuk perubahan, dan membimbing committer lain ketika mereka perlu memodifikasi basis kode.
Namun, saat menelusuri beberapa kode sumber JDK, saya tidak pernah menemukan kata kunci ini, baik untuk kelas, metode, atau variabel. Hal yang sama berlaku untuk berbagai sistem yang harus saya ulas.
Apakah ada alasan? Apakah ini merupakan paradigma desain yang umum untuk membiarkan semuanya berubah dari dalam?
final
bidang memiliki semantik yang sama dengan menulisvolatile
bidang, dan kemudian membacanya nanti harus memiliki semantik baca yang mudah berubah, ini tidak selalu seperti yang Anda inginkanJawaban:
Saya menduga bahwa alasan Anda tidak melihatnya adalah karena JDK dirancang untuk diperpanjang (itu adalah dasar dari mana semua program Anda dibangun). Tidak jarang sama sekali bagi kode aplikasi untuk memanfaatkannya. Saya juga tidak akan berharap untuk melihat banyak dalam kode perpustakaan baik (karena perpustakaan sering dirancang untuk ekstensi juga).
Coba lihat beberapa proyek open source yang bagus dan saya pikir Anda akan menemukan lebih banyak.
Berbeda dengan apa yang Anda lihat di Jawa, di dunia .NET, saya telah mendengar argumen berkali-kali bahwa klase seharusnya
sealed
(mirip dengan final diterapkan pada kelas) secara default, dan bahwa pengembang harus secara eksplisit melepaskan segel Itu.sumber
final
pada bidang dan bukan pada metode. Kelas yang tidak dapat berubah juga dapat dirancang untuk diperpanjang.Masalah dengan menggunakan
final
untuk menyampaikan bahwa sesuatu hanya-baca adalah bahwa itu hanya benar-benar berfungsi untuk tipe primitif sepertiint
,char
dll. Semua objek di Jawa sebenarnya disebut menggunakan pointer (jenis). Akibatnya, saat Anda menggunakanfinal
kata kunci pada objek, Anda hanya mengatakan bahwa referensi tersebut hanya baca, objek itu sendiri masih bisa berubah.Itu mungkin telah digunakan lebih banyak jika itu benar-benar membuat objek hanya-baca. Dalam C ++ itulah yang
const
berfungsi dan hasilnya kata kunci ini jauh lebih berguna dan banyak digunakan.Satu tempat saya sangat menggunakan
final
kata kunci adalah dengan parameter untuk menghindari kebingungan yang dibuat oleh hal-hal seperti ini:Dalam contoh ini tampak jelas mengapa ini tidak berhasil tetapi jika
someMethod(FancyObject)
kebingungan besar dan rumit dapat terjadi. Kenapa tidak menghindarinya?Ini juga merupakan bagian dari standar pengkodean Sun (atau Oracle sekarang saya kira).
sumber
final
di kelas Java API, sebagian besar objek telah berubah seperti dengan banyak perpustakaan Scala. Kemudian membuat bidang objekfinal
membuat kelas tidak berubah dalam banyak kasus. Desain ini sudah digunakan diBigDecimal
danString
.Saya setuju bahwa
final
kata kunci meningkatkan keterbacaan. Itu membuatnya lebih mudah untuk dipahami ketika suatu objek tidak berubah. Namun, di Jawa sangat verbose, khususnya (menurut saya) ketika digunakan pada parameter. Ini bukan untuk mengatakan bahwa orang tidak boleh menggunakannya karena itu verbose, tetapi mereka tidak menggunakannya karena itu verbose.Beberapa bahasa lain, seperti scala, membuatnya lebih mudah untuk membuat deklarasi akhir ( val ). Dalam bahasa-bahasa ini, deklarasi akhir bisa lebih umum daripada variabel.
Perhatikan bahwa ada banyak kegunaan berbeda dari kata kunci akhir. Sebagian besar posting Anda mencakup item 2 dan 3.
sumber
Yah untuk memulainya, Konvensi Kode Java resmi tidak mendukung atau melarang penggunaan khusus
final
. Artinya, pengembang JDK bebas memilih apa yang mereka inginkan.Saya tidak bisa membaca pikiran mereka tetapi bagi saya, preferensi untuk menggunakan
final
atau tidak telah menjadi masalah fokus. Masalah apakah saya punya cukup waktu untuk berkonsentrasi penuh pada kode atau tidak .final
sebagai sampah yang hanya mengaburkan hal-hal yang sudah cukup jelas diungkapkan dalam kode. Sepertinya pengembang JDK termasuk dalam kategori itu juga.Di sisi lain, itu benar-benar berlawanan dalam proyek lain, di mana kami menghabiskan rata-rata satu jam pada 100 baris kode. Di sana, saya menemukan diri saya menembak
final
seperti senapan mashine dalam kode saya sendiri dan orang lain - hanya karena itu adalah cara tercepat untuk mendeteksi maksud orang yang menulisnya sebelum saya dan, juga, cara tercepat untuk mengomunikasikan niat saya sendiri untuk orang yang akan mengerjakan kode saya nanti.Penalaran seperti di atas memang licin. Optimalisasi prematur dapat membahayakan; Donald Knuth lebih jauh menyebutnya "akar segala kejahatan" . Jangan biarkan itu menjebak Anda. Tulis kode bodoh .
sumber
Baru-baru ini saya menemukan kegembiraan fitur "Save Actions" di Eclipse IDE. Saya dapat memaksanya untuk memformat ulang kode saya, memasukkan
@Override
anotasi yang hilang , dan melakukan beberapa hal bagus seperti menghapus tanda kurung yang tidak perlu dalam ekspresi atau meletakkanfinal
kata kunci di mana-mana secara otomatis setiap kali saya menekanctrl + S
. Saya mengaktifkan beberapa pemicu itu dan, nak, ini sangat membantu!Ternyata banyak dari pemicu tersebut bertindak seperti cek kewarasan cepat untuk kode saya.
ctrl + s
? - mungkin saya mengacaukan tipe parameter di suatu tempat!final
. Apakah harus mengubah nilainya?Ternyata semakin sedikit variabel berubah semakin sedikit masalah yang saya miliki pada waktu debug. Berapa kali Anda mengikuti nilai beberapa variabel hanya untuk menemukan bahwa itu entah bagaimana berubah dari katakan 5 ke 7? "Bagaimana bisa ?!" Anda bertanya pada diri sendiri dan menghabiskan beberapa jam berikutnya melangkah masuk dan keluar dari metode yang tak terhitung jumlahnya untuk mengetahui bahwa Anda telah membuat kesalahan dalam logika Anda. Dan untuk memperbaikinya Anda harus menambahkan satu lagi bendera, beberapa kondisi dan hati-hati mengubah beberapa nilai di sana-sini.
Oh, aku benci debugging! Setiap kali saya menjalankan debugger, saya merasa waktu saya hampir habis dan saya sangat membutuhkan waktu itu untuk membuat setidaknya beberapa impian masa kecil saya menjadi kenyataan! Persetan dengan debugging!
final
Berarti tidak ada lagi perubahan nilai yang misterius. Lebih banyakfinal
s => lebih sedikit bagian yang rapuh dalam kode saya => lebih sedikit bug => lebih banyak waktu untuk melakukan hal-hal yang baik!Sedangkan untuk
final
kelas dan metode saya tidak terlalu peduli. Saya suka polimorfisme. Polimorfisme berarti penggunaan kembali berarti lebih sedikit kode berarti lebih sedikit bug. JVM melakukan pekerjaan yang cukup bagus dengan devirtualization dan metode inlining, jadi saya tidak melihat nilai dalam membunuh kemungkinan untuk menggunakan kembali kode untuk manfaat kinerja yang tidak sehat.Melihat semua
final
itu dalam kode agak mengganggu pada awalnya dan membutuhkan waktu untuk terbiasa juga. Beberapa rekan tim saya masih sangat terkejut melihat begitu banyakfinal
kata kunci. Saya berharap ada pengaturan di IDE untuk pewarnaan sintaks khusus untuk itu. Saya akan senang untuk mengubahnya ke beberapa warna abu-abu (seperti anotasi) sehingga mereka tidak akan terlalu mengganggu ketika membaca kode. Eclipse saat ini memiliki warna terpisah untukreturn
dan semua kata kunci lainnya tetapi tidak untukfinal
.sumber
do
notasi :) Tentu saja, Java bukan bahasa terbaik untuk menulis dalam gaya fungsional tetapi setidaknya itu memungkinkan Anda untuk menulis kode yang kuat -dan itulah yang saya benar-benar pedulikan.