Di kelas Java metode dapat didefinisikan final
, untuk menandai bahwa metode ini mungkin tidak diganti:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
Itu jelas, dan mungkin berguna untuk melindungi dari pengesampingan yang tidak disengaja, atau mungkin kinerja - tapi itu bukan pertanyaan saya.
Pertanyaan saya adalah: Dari sudut pandang OOP saya mengerti bahwa, dengan mendefinisikan suatu metode final
, perancang kelas menjanjikan metode ini akan selalu berfungsi seperti yang dijelaskan, atau tersirat. Namun seringkali ini mungkin berada di luar pengaruh penulis kelas, jika apa yang dilakukan metode ini lebih rumit daripada hanya memberikan properti .
Batasan sintaksis jelas bagi saya, tetapi apa implikasinya dalam arti OOP? Apakah final
digunakan dengan benar dalam pengertian ini oleh sebagian besar penulis kelas?
"Kontrak" apa yang final
dijanjikan metode?
Pertama-tama, Anda dapat menandai kelas non-abstrak
final
serta bidang dan metode. Dengan cara ini seluruh kelas tidak dapat disubklasifikasikan. Jadi, perilaku kelas akan diperbaiki.Saya setuju bahwa metode penandaan
final
tidak menjamin bahwa perilaku mereka akan sama dalam subkelas jika metode ini memanggil metode non-final. Jika perilaku memang perlu diperbaiki, ini harus dicapai dengan konvensi dan desain yang cermat. Dan jangan lupa untuk mengatakan ini di javadoc! (Dokumentasi java)Terakhir,
final
kata kunci memiliki peran yang sangat penting dalam Java Memory Model (JMM). Dijamin oleh JMM bahwa untuk mencapai visibilitasfinal
bidang Anda tidak perlu sinkronisasi yang tepat. Misalnya:sumber
String
, tetapi di kelas yang ditentukan pengguna). Tapi apa yang Anda katakan tentang "akhir tidak menjamin perilaku" adalah tepat poin saya. Saya setuju, dok dan desain itu penting.final
tidak akan memastikan visibilitas perubahan yang dibuat ke objek majemuk, sepertiMap
.Saya tidak yakin Anda dapat membuat pernyataan tentang penggunaan "final" dan bagaimana hal itu berdampak pada kontrak desain keseluruhan perangkat lunak. Anda dijamin bahwa tidak ada pengembang yang dapat mengganti metode ini dan membatalkan kontraknya dengan cara itu. Tapi di sisi lain, metode akhir mungkin mengandalkan variabel kelas atau contoh yang nilainya ditetapkan oleh subclass, dan dapat memanggil metode kelas lain yang sedang ditimpa. Jadi final paling tidak merupakan jaminan yang sangat lemah.
sumber
const
. Seperti dichar const * const = "Hello"
atauchar const * const addName(char const * const name) const
...Tidak, itu tidak di luar pengaruh penulis kelas. Anda tidak bisa menimpanya di kelas turunan Anda, karena itu ia akan melakukan apa yang dimaksudkan oleh kelas dasar penulis.
http://download.oracle.com/javase/tutorial/java/IandI/final.html
Perlu dicatat adalah bagian di mana ia menyarankan bahwa metode yang dipanggil dari konstruktor harus
final
.sumber