Bir arabirimin yöntem uygulamasını @Override mı kullanmalıyız?


432

Bir arabirim yöntemini uygulayan bir yönteme açıklama yapılmalı @Overridemıdır?

Bir Javadoc Overrideaçıklama diyor ki:

Bir yöntem bildiriminin bir üst sınıftaki yöntem bildirimini geçersiz kılmayı amaçladığını gösterir. Bir yöntem bu açıklama tipiyle ek açıklama eklenirse ancak bir üst sınıf yöntemini geçersiz kılmazsa, bir hata mesajı oluşturmak için derleyiciler gerekir.

Bir arayüzün teknik olarak bir üst sınıf olduğunu düşünmüyorum. Yoksa öyle mi?

Question Elaboration


5
vay bu soru daha kısa olabilir, ama ihtiyacım olan soru. Teşekkürler
Dan Rosenstark

1
@Override makalesinin yerini bulamıyorum (Oracle yakın zamanda eski Sun bloglarını taşıdı). Nasıl bulacağınızı biliyor musunuz?
Kertenkele Bill

4
Şimdiye kadar @Implement (s) ek açıklamasına sahip olmalıyız (2015). Bu her şeyi açıklığa kavuşturacak!
Alex

3
Şimdiye kadar (2015) java 8 ile @Override kullanmalı mıyız?
Lorenzo Sciuto

Yanıtlar:


305

Mümkün olduğunca @Override kullanmalısınız. Basit hataların yapılmasını önler. Misal:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

Bu derlenmez çünkü düzgün bir şekilde geçersiz kılmaz public boolean equals(Object obj) .

Aynı şey, bir arabirimi ( yalnızca 1.6 ve üstü ) uygulayan veya bir Super sınıfının yöntemini geçersiz kılan yöntemler için de geçerlidir.


150
Not bunu olamaz Java 5 bir arabirim uygulama bir yönteme @Override ek açıklama eklemek - bu bir hata üretir. Java 6'da izin verilir.
Bill Michell

17
Hayır, hayır. Aslında, Eclipse bir arabirimi uygulayan yöntemleri doldururken otomatik olarak @Override ekler.
jjnguy

14
-1'e kadar olan yanıt, Java 1.5'ten 1.6'ya bir arabirim yönteminin uygulanmasıyla ilgili farklı davranışlar hakkında bir açıklama içermesine kadar. Bunun insanlar için kafa karıştırıcı bir yönü olduğunu gördüm ve gerçekten bir söz hak ediyor.
Grundlefleck

2
Tutulma şikayet ediyorsa, ur jdk değerini> 1.5'e yükseltin ve derleyici uyumluluk düzeyini 1.6 veya 1.7 olarak değiştirin. Bunu yapmak için ur project-> properties-> Java derleyicisine sağ tıklayın ve 1.5'ten yüksek olanı seçin.
Gül

1
Herkes cevabı gerçekten haklı kılan bir örnek düşünebilir mi (temel yöntemleri geçersiz kılmak yerine arayüzleri uygulamak)? Benim için büyük bir artı, okuyucuların belirli bir yöntemin nasıl ve ne şekilde kullanılabileceğine dair beklentilerini belirlemesine yardımcı olmasıdır.
Joe Lee-Moyet

103

Javac davranışının değiştiğine inanıyorum - 1.5 ile açıklamayı yasakladı, 1.6 ile değişmedi. Ek açıklama bir derleme zamanı denetimi sağlar, bu nedenle 1.6 kullanıyorsanız, bunun için giderdim.


1
Ekstra kontrol nedir?
Michael Carman

17
@Michael Herhangi bir arayüzün silinip silinmediğini fark edebilirsiniz.
Sanghyun Lee

68

Yöntemlere her zaman @OverrideVarsa, .

JDK 5'te bu, üst sınıfların geçersiz kılma yöntemleri, JDK 6 ve 7'de üst sınıfların geçersiz kılma yöntemleri ve arabirimlerin uygulama yöntemleri anlamına gelir. Bunun nedeni, daha önce de belirtildiği gibi, derleyicinin bir yöntemi geçersiz kıldığınızı (veya uyguladığınızı) ancak aslında yeni bir yöntem (farklı imza) tanımladığınız hataları yakalamasına izin vermesidir.

equals(Object)Vsequals(YourObject) , örneğin noktasında standart bir durum olmakla birlikte, aynı argüman arayüz uygulamaları için yapılabilir.

Arabirim yöntemlerinin uygulanmasına açıklama eklemenin zorunlu olmasının nedeninin JDK 5'in bunu bir derleme hatası olarak işaretlemesi olduğunu düşünürüm. JDK 6 bu ek açıklamayı zorunlu hale getirirse geriye dönük uyumluluğu bozar.

Eclipse kullanıcısı değilim, diğer IDE'lerde (IntelliJ), @Override ek açıklama, yalnızca proje JDK 6+ projesi olarak ayarlanmışsa arabirim yöntemleri uygulanırken eklenir. Eclipse'in benzer olduğunu düşünürdüm.

Ancak, bu kullanım için farklı bir ek açıklama, belki bir @Implementsek açıklama görmeyi tercih ederdim .



11

JDK 5.0, @Overridearabirimde bildirilen yöntemi (derleme hatası) uyguluyorsanız ek açıklama kullanmanıza izin vermez , ancak JDK 6.0 buna izin verir. Yani proje tercihinizi ihtiyacınıza göre yapılandırabilirsiniz.


4

Bir ederse beton sınıfı değildir basan soyut bir yöntemi kullanılarak @Overrideiçin uygulanması derleyici değişmez herhangi uygulanmayan yöntemler sizi uyarır beri açık bir konudur. Bu durumlarda, okunabilirlikten uzaklaştığı konusunda bir argüman yapılabilir - kodunuzda okunacak daha çok şeydir ve daha az bir dereceye kadar denir @Overrideve değil @Implement.


3

Kendi sınıflarınızdan devralınan kendi yöntemlerinizi geçersiz kılmak genellikle bir ide kullanarak yeniden düzenleme işlemlerini bozmaz. Ancak kitaplıktan devralınan bir yöntemi geçersiz kılarsanız, bu yöntemi kullanmanız önerilir. Eğer yapmazsanız, daha sonraki bir kütüphane değişikliğinde genellikle hata almazsınız, ancak gizli bir hata alırsınız.


3

JDK ile ilgili bir sorun değil. Eclipse Helios'ta, JDK 5 veya 6'nın hangisi olursa olsun, uygulanan arabirim yöntemleri için @Override ek açıklamasına izin verir.


2

Benim için, çoğu zaman bu, bazı kodların Java 6'nın derlenmesini gerektiren tek nedendir. Buna değer olup olmadığından emin değilim.


2

Java8'deki javadoc'u okuyarak, Geçersiz kılma arabirimi bildiriminde aşağıdakileri bulabilirsiniz:

Bu ek açıklama türü ile bir yönteme açıklama eklenirse, aşağıdaki koşullardan en az biri geçerli olmadığı sürece bir hata iletisi oluşturmak için derleyiciler gerekir:

  • Yöntem, bir süper tipte bildirilen bir yöntemi geçersiz kılar veya uygular.
  • Yöntemin, {@linkplain Nesnesi} 'nde bildirilen herhangi bir genel yöntemin geçersiz kılmaya eşdeğer bir imzası vardır.

Bu nedenle, en azından java8'de, bir arabirim yönteminin uygulanmasında @Override kullanmalısınız.


1

Eclipse, @Overrideek açıklamayı, arabirim uygulayan bir sınıfın oluşturulması sırasında "uygulanmayan yöntemler oluşturmasını" söylediğinizde ekler .


1

Dahil etme ile ilgili sorun , çok kafa karıştırıcı olan yöntemi @Overrideçağırmayı unuttuğunuzu düşünmenizi sağlamasıdır . Bu kristal berraklığında olmalıdır. Belki de Java burada kullanılmak üzere bir teklif sunmalıdır . Oh, yine başka bir yarım yamalak Java özelliği ...super.theOverridenMethod()@Interface


3
Bir arayüzü uygulamadığınızda bir süper demek her zaman yapmanız gereken veya yapmak istediğiniz bir şey değildir. Bazen işlevsellik eklersiniz - böylece onu çağırırsınız. Diğer zamanlarda, işlevselliği değiştiriyorsunuz, bu yüzden çağırmıyorsunuz. Bir API yazarı iç işlevselliğe bağlı olup olmadığını belgelemeli ve sınıfın düzgün bir şekilde nasıl genişletilebileceğine dair belgelenmiş bir sözleşme oluşturmalıdır.
lilbyrdie

1

Java 6 ve sonraki sürümlerinde, @Overridearabirim uygulayan bir yöntem için kullanabilirsiniz .

Ancak, bunun mantıklı olduğunu düşünmüyorum: geçersiz kılma, süper sınıfta bir yöntemi havalandırdığınız ve alt sınıfta uyguladığınız anlamına gelir.

Eğer bir arayüz uyguluyorsanız, bence @Implementbaşka bir şey kullanmalıyız ama değil @Override.


0

Arabirim için @Override kullanmak derleme hatasına neden oldu. Yani, onu kaldırmak zorunda kaldım.

Hata mesajı " The method getAllProducts() of type InMemoryProductRepository must override a superclass method" gitti .

Ayrıca " One quick fix available: Remove @Override annotation."

Eclipse 4.6.3, JDK 1.8.0_144'teydi.


0

Uygulayan sınıf interfacebir abstractsınıfsa, @Overrideuygulamanın bir interfaceyöntem için olduğundan emin olmak yararlıdır ; @Overridea abstractsınıfı olmadan, uygulama yöntemi imzası, belirtilen yöntemle eşleşmese bile iyi derlenebilir interface; eşleşmeyen interfaceyöntem, uygulanmayan olarak kalacaktır. @Zhao tarafından alıntılanan Java doktoru

Yöntem, bir süper tipte bildirilen bir yöntemi geçersiz kılar veya uygular

açıkça bir abstractsüper sınıfa gönderme yapıyor ; bir interfacesüper tip olarak adlandırılamaz. Dolayısıyla, somut sınıflarda yöntem uygulamaları @Overrideiçin gereksizdir ve mantıklı değildir interface.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.