JavaRush /Blog Java /Random-MS /kaedah dan kelas Java akhir
articles
Tahap

kaedah dan kelas Java akhir

Diterbitkan dalam kumpulan
Dengan menandakan kaedah kelas dengan pengubah suai final, kami maksudkan bahawa tiada kelas terbitan dapat mengatasi kaedah ini dengan menukar pelaksanaan dalamannya. Dalam erti kata lain, kita bercakap tentang versi akhir kaedah. Kelas secara keseluruhan juga boleh ditandakan sebagai final. kaedah dan kelas Java akhir - 1
final class NoExtending {
// …
}
Kelas yang ditandakan sebagai finaltidak boleh diwarisi dan semua kaedahnya secara tidak langsung memperoleh harta tersebut final. Menggunakan ciri a finaldalam pengisytiharan kelas dan kaedah boleh meningkatkan tahap keselamatan kod. Jika kelas dilengkapi dengan pengubah suai final, tiada siapa boleh melanjutkan kelas dan mungkin memecahkan kontraknya dalam proses. Jika tanda finalmenunjukkan kaedah, anda boleh mempercayai sepenuhnya pelaksanaan dalamannya dalam semua situasi tanpa rasa takut akan "pemalsuan". Ia adalah sesuai untuk menggunakan final, sebagai contoh, dalam pengisytiharan kaedah yang memerlukan pengesahan kata laluan yang dimasukkan oleh pengguna untuk memastikan bahawa pelaksanaan yang tepat tentang kaedah asalnya bertujuan. Penyerang yang mungkin tidak akan dapat mengubah pelaksanaan asal kaedah sedemikian dengan "meluncur" ke dalam program versi yang ditindih, yang, katakan, sentiasa mengembalikan nilai benar, menunjukkan pendaftaran pengguna yang berjaya, tanpa mengira kata laluan apa dia sebenarnya masuk. Anda mempunyai hak, jika keadaan tertentu membenarkan, untuk pergi lebih jauh dan mengisytiharkan finalkeseluruhan kelas sebagai kelas; kaedah tersebut ValidatePasswordakan memperoleh harta yang sama secara tidak langsung. Penggunaan pengubah suai finaldalam kaedah atau pengisytiharan kelas mengenakan sekatan yang serius terhadap kemungkinan penggunaan dan pembangunan kod selanjutnya. Penggunaan finalkaedah dalam pengisytiharan adalah penunjuk yang pasti bahawa pelaksanaan kaedah adalah serba lengkap dan lengkap sepenuhnya. Pengaturcara lain yang ingin menggunakan kelas anda, mengembangkan fungsinya untuk memenuhi keperluan mereka sendiri, akan dihadkan dalam pilihan cara untuk mencapai matlamat mereka atau dilucutkan sepenuhnya. Dengan menandakan finalkelas secara keseluruhan, anda akan melumpuhkan keupayaannya untuk diwarisi dan berkemungkinan besar akan mengurangkan kegunaannya kepada orang lain dengan ketara. Apabila anda akan menggunakan pengubah suai final, pastikan sama ada ANDA bersedia untuk pengorbanan sedemikian dan sama ada ia berbaloi untuk dilakukan. Dalam banyak kes, untuk mencapai tahap keselamatan kod yang mencukupi, adalah tidak perlu untuk menetapkan keseluruhan kelas sebagai final- adalah agak mungkin untuk mengekalkan kebolehlanjutan kelas dengan menandakan finalhanya elemen struktur "kritikal" dengan pengubah suai. Dalam kes ini, anda akan membiarkan fungsi utama kelas itu utuh dan pada masa yang sama membenarkan warisannya dengan penambahan ahli baharu, tetapi tanpa mentakrifkan semula yang "lama". Sudah tentu, medan yang diakses oleh kod kaedah finalmesti seterusnya ditetapkan sebagai finalsama ada private, kerana jika tidak, mana-mana kelas terbitan akan dapat menukar kandungannya, menjejaskan tingkah laku kaedah yang sepadan. Kesan lain menggunakan pengubah suai finaladalah berkaitan dengan memudahkan masalah pengoptimuman kod yang diselesaikan oleh pengkompil. Inilah yang berlaku apabila kaedah yang tidak ditanda sebagai dipanggilfinal, sistem masa jalan menentukan kelas sebenar objek, mengaitkan panggilan dengan kod yang paling sesuai daripada kumpulan kaedah terlebih beban dan memindahkan kawalan kepada kod tersebut. Tetapi jika, sebagai contoh, kaedah getNamedalam contoh kelas Attryang dibincangkan sebelum ini telah ditetapkan sebagai final, operasi memanggilnya mungkin telah dipermudahkan dengan ketara. Dalam kes yang paling remeh, seperti yang berkenaan getName, pengkompil boleh menggantikan panggilan kaedah dengan kod badannya. Mekanisme ini dipanggil kod inlining. Apabila menggunakan versi sebaris kaedah, getNamedua ungkapan berikut dilaksanakan dengan tepat sama:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Walaupun ungkapan di atas adalah setara, yang kedua masih mempunyai kelebihan, kerana kaedah ini getNamemembolehkan anda memberikan medan nama sebagai harta baca sahaja, dan kod kelas mempunyai tahap abstraksi tertentu, yang membolehkan anda menukar dengan lebih bebas pelaksanaan kelas. Skim pengoptimuman yang sama boleh digunakan oleh pengkompil kepada kaedah privatedan statiс, kerana ia juga tidak membenarkan penggantian. Menggunakan pengubah suai finaldalam pengisytiharan kelas juga menjadikan beberapa operasi semakan jenis lebih cekap. Dalam kes ini, banyak operasi sedemikian boleh dilakukan sudah pada peringkat penyusunan dan oleh itu ralat berpotensi dikesan lebih awal. Jika pengkompil menemui rujukan kepada kelas dalam teks sumber final, ia boleh "pasti" bahawa objek yang sepadan adalah daripada jenis yang ditentukan. Pengkompil dapat segera menentukan tempat yang diduduki oleh kelas dalam hierarki kelas keseluruhan dan menyemak sama ada ia digunakan dengan betul atau tidak. Jika pengubahsuai finaltidak digunakan, semakan yang sepadan hanya dijalankan pada peringkat pelaksanaan program. Latihan 3.4. Adakah dinasihatkan untuk memasukkan pengubah suai akhir dalam pengisytiharan kaedah (dan jika ya, yang manakah) bagi kelas kenderaan dan kenderaan penumpang ? Pautan ke sumber asal: http://src-code.net/metody-i-klassy-final-java
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION