Saya hanya mencoba memahami mengapa semua bidang yang ditentukan dalam Antarmuka secara implisit static
dan final
. Ide untuk menjaga bidang static
masuk akal bagi saya karena Anda tidak dapat memiliki objek antarmuka tetapi mengapa mereka final
(secara implisit)?
Ada yang tahu mengapa desainer Java pergi dengan membuat bidang dalam antarmuka static
dan final
?
Jawaban:
Antarmuka tidak boleh memiliki perilaku atau status karena hanya dimaksudkan untuk menentukan kontrak interaksi, tanpa detail implementasi. 'Tidak ada perilaku' diterapkan dengan tidak mengizinkan badan metode / konstruktor atau blok inisialisasi statis / instance. 'Tidak ada status' diberlakukan dengan hanya mengizinkan kolom final statis. Oleh karena itu, kelas dapat memiliki status (status statis), tetapi status instance tidak disimpulkan oleh antarmuka.
BTW: Konstanta di Java ditentukan oleh bidang akhir statis (dan menurut ketentuan, nama tersebut menggunakan UPPER_CASE_AND_UNDERSCORES).
sumber
static final
, yang sedekat mungkin dengan real (sebenarnya adalah C / C ++)const
seperti yang Anda dapatkan di java. Sayangnya ini implisit dan dapat menyebabkan kebingungan bagi non-ahli. (Saya baru menyadari bahwa itustatic
karena saya mengamati perilaku yang tidak diinginkan. Saya mengetahui bahwa itufinal
hanya dari jawaban ini.)Alasan untuk menjadi
final
Penerapan apa pun dapat mengubah nilai bidang jika tidak ditentukan sebagai final. Kemudian mereka akan menjadi bagian dari implementasi. Antarmuka adalah spesifikasi murni tanpa implementasi apa pun.
Alasan untuk menjadi
static
Jika mereka statis, maka mereka milik antarmuka, dan bukan objek, atau jenis waktu proses dari objek.
sumber
Ada beberapa poin yang dipoles di sini:
Hanya karena kolom dalam antarmuka bersifat final statis secara implisit, tidak berarti kolom tersebut harus berupa konstanta waktu kompilasi, atau bahkan tidak dapat diubah. Anda dapat mendefinisikan mis
(Berhati-hatilah bahwa melakukan ini di dalam definisi anotasi dapat membingungkan javac , yang berkaitan dengan fakta bahwa yang di atas sebenarnya mengompilasi ke penginisialisasi statis.)
Juga, alasan pembatasan ini lebih gaya daripada teknis, dan banyak orang ingin melihatnya santai .
sumber
Kolom harus statis karena tidak boleh abstrak (seperti metode can). Karena tidak bisa abstrak, pelaksana tidak akan bisa secara logis menyediakan implementasi bidang yang berbeda.
Bidang harus final, saya pikir, karena bidang dapat diakses oleh pelaksana yang berbeda memungkinkan mereka untuk diubah mungkin bermasalah (seperti sinkronisasi). Juga untuk menghindarinya untuk diimplementasikan kembali (disembunyikan).
Hanya pikiranku.
sumber
public static
bidang yang tidakfinal
, findbugs akan mengeluh (benar!).Saya menganggap persyaratan bahwa bidang menjadi final sebagai terlalu membatasi dan kesalahan oleh desainer bahasa Java. Ada kalanya, misalnya penanganan pohon, ketika Anda perlu menyetel konstanta dalam implementasi yang diperlukan untuk melakukan operasi pada objek dengan tipe antarmuka. Memilih jalur kode pada kelas pelaksana adalah sebuah kludge. Solusi yang saya gunakan adalah mendefinisikan fungsi antarmuka dan mengimplementasikannya dengan mengembalikan literal:
Namun, akan lebih sederhana, lebih jelas dan tidak terlalu rentan terhadap implementasi yang menyimpang untuk menggunakan sintaks ini:
sumber
Spesifikasi, kontrak ... Instruksi mesin untuk akses lapangan menggunakan alamat objek ditambah offset lapangan. Karena kelas dapat mengimplementasikan banyak antarmuka, tidak ada cara untuk membuat bidang antarmuka non-final memiliki offset yang sama di semua kelas yang memperluas antarmuka ini. Oleh karena itu, mekanisme yang berbeda untuk akses bidang harus diterapkan: dua akses memori (dapatkan offset bidang, dapatkan nilai bidang), bukan satu plus pemeliharaan jenis tabel bidang virtual (analog dari tabel metode virtual). Kira mereka hanya tidak ingin mempersulit jvm untuk fungsionalitas yang dapat dengan mudah disimulasikan melalui hal-hal yang ada (metode).
Dalam scala kita dapat memiliki bidang di antarmuka, meskipun secara internal diterapkan seperti yang saya jelaskan di atas (sebagai metode).
sumber
static
:Apa-apa (variabel atau metode) yang
static
di Jawa dapat dipanggil sebagaiClassname.variablename
atauClassname.methodname
atau langsung. Tidak wajib untuk memanggilnya hanya dengan menggunakan nama objek.Dalam antarmuka, objek tidak dapat dideklarasikan dan
static
memungkinkan untuk memanggil variabel hanya melalui nama kelas tanpa perlu nama objek.final
:Ini membantu mempertahankan nilai konstan untuk variabel karena tidak dapat diganti dalam subkelasnya.
sumber