Dengan menyatakan metode kelas dengan pengubah
final
, yang kami maksudkan adalah tidak ada kelas turunan yang mampu mengganti metode ini dengan mengubah implementasi internalnya. Dengan kata lain, kita berbicara tentang versi final dari metode ini. Kelas secara keseluruhan juga dapat ditandai sebagai final
.
final class NoExtending {
// …
}
Sebuah kelas yang ditandai sebagai final
tidak dapat diwariskan dan semua metodenya secara tidak langsung memperoleh properti tersebut final
. Menggunakan fitur a final
dalam deklarasi kelas dan metode dapat meningkatkan tingkat keamanan kode. Jika suatu kelas dilengkapi dengan pengubah final
, tidak ada yang dapat memperluas kelas tersebut dan mungkin memutus kontraknya dalam prosesnya. Jika sebuah tanda final
menunjukkan suatu metode, Anda dapat sepenuhnya mempercayai implementasi internalnya dalam segala situasi tanpa takut akan "pemalsuan". Sangat tepat untuk digunakan final
, misalnya, dalam deklarasi suatu metode yang memerlukan verifikasi kata sandi yang dimasukkan oleh pengguna untuk memastikan eksekusi yang tepat sesuai dengan tujuan awal metode tersebut. Kemungkinan penyerang tidak akan dapat mengubah implementasi asli dari metode tersebut dengan "menyelipkan" versi yang telah diganti ke dalam program, yang, misalnya, selalu mengembalikan nilai true, yang menunjukkan keberhasilan pendaftaran pengguna, apa pun kata sandinya. dia benar-benar masuk. Anda mempunyai hak, jika situasi spesifik memungkinkan, untuk melangkah lebih jauh dan mendeklarasikan final
seluruh kelas sebagai sebuah kelas; metode tersebut ValidatePassword
akan memperoleh properti yang sama secara tidak langsung. Penggunaan pengubah final
dalam deklarasi metode atau kelas memberikan batasan serius pada kemungkinan penggunaan dan pengembangan kode lebih lanjut. Penggunaan final
metode dalam deklarasi merupakan indikator pasti bahwa implementasi metode bersifat mandiri dan lengkap. Pemrogram lain yang ingin menggunakan kelas Anda, memperluas fungsinya agar sesuai dengan kebutuhan mereka, akan dibatasi dalam pilihan cara untuk mencapai tujuan mereka atau sama sekali kehilangan cara tersebut. Dengan menandai final
suatu kelas secara keseluruhan, Anda akan menonaktifkan kemampuannya untuk diwariskan dan kemungkinan besar akan mengurangi kegunaannya secara signifikan bagi orang lain. Saat Anda akan menggunakan pengubah final
, pastikan apakah ANDA siap untuk pengorbanan tersebut dan apakah pengorbanan tersebut layak dilakukan. Dalam banyak kasus, untuk mencapai tingkat keamanan kode yang memadai, tidak perlu menetapkan seluruh kelas sebagai final
- sangat mungkin untuk mempertahankan ekstensibilitas kelas dengan final
hanya menandai elemen struktural "kritis" dengan pengubah. Dalam hal ini, Anda akan membiarkan fungsi utama kelas tetap utuh dan pada saat yang sama mengizinkan pewarisannya dengan penambahan anggota baru, tetapi tanpa mendefinisikan ulang anggota "lama". Tentu saja, bidang yang diakses oleh kode metode final
pada gilirannya harus ditetapkan sebagai final
salah satu private
, karena jika tidak, kelas turunan mana pun akan dapat mengubah kontennya, sehingga memengaruhi perilaku metode terkait. Efek lain dari penggunaan pengubah final
terkait dengan penyederhanaan masalah optimasi kode yang diselesaikan oleh kompiler. Inilah yang terjadi bila suatu metode yang tidak ditandai sebagai dipanggilfinal
, sistem runtime menentukan kelas objek yang sebenarnya, mengaitkan panggilan dengan kode yang paling sesuai dari grup metode yang kelebihan beban, dan mentransfer kontrol ke kode tersebut. Namun jika, misalnya, metode getName
dalam contoh kelas Attr
yang dibahas sebelumnya ditetapkan sebagai final
, pengoperasian pemanggilannya mungkin akan disederhanakan. Dalam kasus yang paling sepele, seperti yang menyangkut getName
, kompiler dapat dengan mudah mengganti pemanggilan metode dengan kode tubuhnya. Mekanisme ini disebut penyebarisan kode. Saat menggunakan metode versi inline, getName
dua ekspresi berikut dieksekusi persis sama:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Meskipun ekspresi di atas setara, ekspresi kedua masih memiliki keunggulan, karena metode ini getName
memungkinkan Anda memberikan properti read-only pada bidang nama, dan kode kelas memiliki tingkat abstraksi tertentu, yang memungkinkan Anda untuk lebih bebas mengubah implementasi kelas. Skema pengoptimalan yang sama dapat diterapkan oleh kompiler pada metode private
dan statiс
, karena metode tersebut juga tidak mengizinkan penggantian. Menggunakan pengubah final
dalam deklarasi kelas juga membuat beberapa operasi pengecekan tipe menjadi lebih efisien. Dalam hal ini, banyak operasi serupa yang sudah dapat dilakukan pada tahap kompilasi dan oleh karena itu potensi kesalahan terdeteksi jauh lebih awal. Jika kompiler menemukan referensi ke suatu kelas dalam teks sumber final
, dapat "pasti" bahwa objek yang bersangkutan adalah tipe yang ditentukan. Kompiler dapat segera menentukan tempat yang ditempati oleh suatu kelas dalam hierarki kelas secara keseluruhan dan memeriksa apakah kelas tersebut digunakan dengan benar atau tidak. Jika pengubah final
tidak diterapkan, pemeriksaan terkait hanya dilakukan pada tahap eksekusi program. Latihan 3.4. Apakah disarankan untuk memasukkan pengubah akhir dalam deklarasi metode (dan jika demikian, yang mana) dari kelas vehicle dan penumpangvehicle ? Tautan ke sumber asli: http://src-code.net/metody-i-klassy-final-java
GO TO FULL VERSION