Di Jawa, sangat sah untuk mendefinisikan final
argumen dalam metode antarmuka dan tidak mematuhinya dalam kelas implementasi, misalnya:
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
Dalam contoh di atas, bar
dan baz
memiliki final
definisi yang berlawanan di kelas VS antarmuka.
Dengan cara yang sama, tidak ada final
batasan yang diberlakukan ketika satu metode kelas memperluas yang lain, baik abstract
atau tidak.
Meskipun final
memiliki beberapa nilai praktis di dalam tubuh metode kelas, apakah ada titik yang menentukan final
parameter metode antarmuka?
final
tidak melakukan apa pun dengan tipe asli, karena mereka disalininterface
definisi hanya berbeda dalamfinal
atribut argumen, maka.class
file yang dihasilkan adalah byte-untuk-byte yang identik (dan tentu sajajavap -v
menghasilkan output yang sama). Hal yang sama berlaku untuk dua kelas yang hanya berbedafinal
pada satu atribut, omong-omong!Jawaban:
Sepertinya tidak ada gunanya. Menurut Spesifikasi Bahasa Jawa 4.12.4 :
Namun,
final
pengubah pada parameter metode tidak disebutkan dalam aturan untuk mencocokkan tanda tangan metode yang diganti, dan itu tidak berpengaruh pada pemanggil, hanya dalam tubuh implementasi. Juga, seperti dicatat oleh Robin dalam komentar,final
pengubah pada parameter metode tidak berpengaruh pada kode byte yang dihasilkan. (Ini tidak benar untuk penggunaan lain darifinal
.)sumber
final
pengubah tidak diberlakukan pada kelas pelaksana. Tanda tangan antarmuka Anda mungkin berbohong.Beberapa IDE akan menyalin tanda tangan dari metode abstrak / antarmuka saat memasukkan metode implementasi di sub kelas.
Saya tidak percaya ada bedanya dengan kompiler.
EDIT: Sementara saya percaya ini benar di masa lalu, saya tidak berpikir IDE saat ini melakukan ini lagi.
sumber
static transient
bidang. ;)Anotasi akhir parameter metode selalu hanya relevan dengan implementasi metode tidak pernah ke pemanggil. Oleh karena itu, tidak ada alasan nyata untuk menggunakannya dalam tanda tangan metode antarmuka. Kecuali jika Anda ingin mengikuti standar pengkodean yang konsisten yang sama, yang membutuhkan parameter metode akhir, di semua tanda tangan metode. Maka itu bagus untuk dapat melakukannya.
sumber
Pembaruan: Jawaban asli di bawah ditulis tanpa sepenuhnya memahami pertanyaan, dan karena itu tidak secara langsung menjawab pertanyaan tersebut.
:)
Namun, itu harus informatif bagi mereka yang ingin memahami penggunaanfinal
kata kunci secara umum .Adapun pertanyaannya, saya ingin mengutip komentar saya sendiri dari bawah.
Saya dapat memikirkan dua alasan mengapa metode tanda tangan dapat memiliki
final
parameter: Kacang dan Objek ( Sebenarnya, keduanya adalah alasan yang sama, tetapi konteks yang sedikit berbeda. )Benda:
Kata
final
kunci memastikan bahwa kami tidak akan secara tidak sengaja membuat panci memasak lokal baru dengan menunjukkan kesalahan kompilasi ketika kami berusaha melakukannya. Ini memastikan kaldu ayam ditambahkan ke panci masak asli kami yangaddChicken
metodenya didapat. Bandingkan ini denganaddVegetables
tempat kami kehilangan kembang kol karena menambahkan bahwa ke panci memasak lokal baru, bukan pot asli yang didapat.Kacang: Ini adalah konsep yang sama dengan objek (seperti yang ditunjukkan di atas) . Kacang pada dasarnya ada
Object
di Jawa. Namun, kacang (JavaBeans) digunakan dalam berbagai aplikasi sebagai cara mudah untuk menyimpan dan menyebarkan koleksi data terkait yang telah ditentukan. Sama seperti yangaddVegetables
bisa mengacaukan proses memasak dengan membuat panci memasak baruStringBuilder
dan membuangnya bersama kembang kol, itu juga bisa melakukan hal yang sama dengan panci memasak JavaBean .sumber
final
di antarmuka, tetapi memilikinya non-final dalam implementasi. Akan lebih masuk akal jika salah satu (a)final
kata kunci tidak diizinkan untuk argumen metode antarmuka (abstrak) (tetapi Anda dapat menggunakannya dalam implementasi), atau (b) mendeklarasikan argumen karenafinal
di antarmuka akan memaksanya untuk dinyatakanfinal
dalam implementasi (tetapi tidak dipaksa untuk non-final).:)
Saya percaya itu mungkin detail yang berlebihan, apakah itu final atau tidak adalah detail implementasi.
(Semacam suka menyatakan metode / anggota dalam antarmuka sebagai publik.)
sumber