Pribadi dan final?

T: Mengingat:

  • private metode tidak dapat diganti oleh subclass
  • final metode tidak dapat diganti oleh subclass
  • final metode memungkinkan kode lebih cepat saat dikompilasi dengan pengoptimalan aktif (javac -O)

Pertanyaan saya adalah:

  1. Mengapa tidak mendeklarasikan semua privatemetode finaljuga?
  2. Apakah sebagian besar kompiler memperlakukan privatemetode sebagai final?

J: Seperti yang Anda tunjukkan, subclass tidak boleh mengganti privatemetode dengan desain. Lebih lanjut, finalkata kunci memberitahu compiler bahwa subclass tidak boleh menimpa metode apapun tingkat aksesnya. Karena privatesudah menyiratkan bahwa subclass tidak boleh mengganti metode, mendeklarasikan privatemetode menjadi finalredundan. Membuat deklarasi tidak akan menimbulkan masalah, tetapi juga tidak akan menyelesaikan apa pun, karena privates secara otomatis dipertimbangkan final.

Nah, praktik mendeklarasikan semua privatemetode finalakan memiliki satu efek samping. Setiap programmer Java pemula yang menemukan kode Anda akan mengasimilasi penggunaan Anda private final, berpikir bahwa privateitu harus dideklarasikan dengan cara itu. Jadi, Anda akan dapat menilai siapa yang telah dan yang belum menghubungi kode Anda. Ini mungkin terbukti latihan yang menarik.

Jadi, untuk menjawab pertanyaan 1, tidak perlu mendeklarasikan privateanggota final.

Adapun pertanyaan 2, compiler dan JVM yang mengoptimalkan dapat memanfaatkan privatemetode dan finalmetode. Karena subclass mungkin tidak menimpa jenis tersebut, tidak perlu melakukan pengikatan dinamis pada waktu proses. Subclass tidak akan pernah mengganti metode, jadi runtime akan selalu mengetahui metode apa yang harus dipanggil tanpa mencari hierarki pewarisan. Selama kompilasi, kompilator yang mengoptimalkan bahkan dapat memilih untuk menyebariskan semua privatedan finalmetode untuk meningkatkan kinerja.

Jadi, untuk menjawab pertanyaan 2, ya, semua kompiler akan memperlakukan privatemetode sebagai final. Kompilator tidak akan mengizinkan privatemetode apa pun untuk diganti. Demikian pula, semua kompiler akan mencegah subclass mengganti finalmetode.

Pertanyaan yang lebih menarik: Akankah semua kompiler mengoptimalkan finals dan privates sehingga mereka sebaris? Jawaban singkatnya tidak. Perilaku pengoptimalan akan bergantung pada kompilator dan pengaturannya.

Catatan: Diskusi kami tentang final pribadi hanya berlaku untuk metode. Variabel anggota akhir pribadi diperlakukan berbeda

Pelajari lebih lanjut tentang topik ini

  • Ingin lebih? Lihat Indeks Q&A Java untuk katalog Q&A lengkap

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

Cerita ini, "Pribadi dan final?" awalnya diterbitkan oleh JavaWorld.