Mengapa java menggunakan anotasi @Override, alih-alih pengubah?

19

Apa motivasi bagi java untuk menggunakan @Overrideanotasi, daripada membuat overridepengubah baru ?

@Override
public String toString() {
   return "";
}

vs.

public override String toString() {
   return "";
}
jwa
sumber
2
Itu adalah renungan.
Tulains Córdova

Jawaban:

21

@Override awalnya tidak dalam bahasa. Ketika merasa perlu menambahkannya, lebih mudah menggunakan mekanisme umum (anotasi) daripada menambahkan kata kunci baru ke bahasa. Menambahkan kata kunci baru selalu merupakan perubahan yang tidak kompatibel karena dapat merusak program yang menggunakan kata itu sebagai pengenal.

Dalam bahasa yang menambahkan penanda override sejak hari pertama, kata kunci ini sering kali merupakan kata kunci (contohnya adalah Kotlin dan Scala), di Jawa soal tetap kompatibel dengan versi Java yang lebih lama yang tidak memiliki marker override.

Michał Kosmulski
sumber
Tampaknya tidak konsisten bahwa penggantian adalah anotasi, ketika ada perubahan yang telah memperkenalkan kata kunci baru. Misalnya pengubah "default" untuk metode antarmuka.
jwa
6
@ jwa Tidak juga: defaultsudah kata kunci yang dipesan (digunakan dalam pernyataan peralihan) - mereka hanya menambahkan penggunaan baru untuk itu. Ada juga beberapa kata kunci yang tidak melakukan apa-apa saat ini tetapi dicadangkan untuk penggunaan di masa mendatang (const, goto) - lihat JLS §3.9
Michał Kosmulski
3
"contohnya adalah Kotlin dan Java" sepertinya salah ketik di sini, apakah Anda bermaksud menulis mis. Scala, bukannya Java?
nyamuk
6
sementara benar bahwa menambahkan kata kunci global merusak barang, itu bisa saja ditambahkan sebagai kata kunci kontekstual tanpa melanggar kode. orang menganggap ini tidak dilakukan karena akan sedikit menyulitkan penguraian dan mekanisme anotasi cukup baik
jk.
1
@ MichałKosmulski: Saya ingat enumkata kunci yang ditambahkan akan merusak kode lama. Lebih banyak melanggar kata kunci di sini: stackoverflow.com/questions/16506411
Allon Guralnek
13

Anda tidak memerlukan anotasi @Override untuk benar-benar mengesampingkan perilaku; Ini anotasi karena itu hanya menambahkan beberapa konteks maksud metode untuk kompiler, bukan mengubah metode itu sendiri.

Tanpa anotasi, Anda mungkin bermaksud untuk menimpa fungsionalitas, tetapi secara tidak sengaja gagal melakukannya (dengan menggunakan tanda tangan yang sedikit berbeda). Menambahkan anotasi memberitahu kompiler untuk menghasilkan kesalahan jika metode ini tidak benar-benar mengesampingkan perilaku.

Karena itu, sangat masuk akal sebagai anotasi.

Eric King
sumber
+1 Masuk akal bahwa mirip dengan menonaktifkan peringatan melalui anotasi, juga dimungkinkan untuk mengaktifkan peringatan / kesalahan opsional melalui anotasi.
Hulk