Java'da Override Anotasyonu

Java'da Override Anotasyonu

Merhabalar,

Daha önce Java 8 ile gelen Optional sınıfından bahsetmiştim. Java ile ilgili ufak detay bilgiler vermeye devam edeceğim. Bu yazımızda Java Override anotasyonunun öneminden bahsedeceğim.

Java ile herhangi bir IDE kullandıysanız karşınıza mutlaka çıkmıştır. Bilmeyenler için kısaca açıklarsak Java’da bir sınıfın interface ve ata sınıfında yer alan metodları implement etmek veya değiştirmek için yazdığımız metodu @Override annotasyonu ile işaretleyerek bunu belirtmiş oluruz. Bir sınıf içerisinde Override anotasyonu metodun üst sınıflardan geldiğini bilmek için güzel bir araçtır. Varolmasının en temel amacı da budur.

Fakat Java’da bu anotasyonu kullanmak zorunda değilsiniz. Bu anotasyonu kaldırdığınızda herhangi bir compile hatası almazsınız. Fakat bu anotasyonun sağladığı önemli bir avantajı daha var. Bunun için çok kısa ve kolay bir örnek yapalım. Özellikle yeni başlayanların hata yaptığı konulardan biri:

Basit bir üye sınıfımız var. Bu sınıfın son metodunu incelerseniz bir equals metodu tanımladık. Bu metodu bir test edelim.

Bu testi çalıştırdığınızda ekranda true yazdığını görüyoruz. equals metodumuz çalışıyor. Şimdi testimizde ufak bir değişiklik yapalım.

Referanslarımızı üst sınıfa yani Object sınıfına çektik. Bu testi çalıştırdığımızda da ekranda true beklerken birden false değerini aldık. Anladınız değil mi hatayı? Java’ya yeni başlayanların durumu anlaması biraz zor olabilir.

Object.equals metodunun işaretin(signature)‘e bakalım: public boolean equals(Object obj) Member sınıfında implement ettiğimiz metod ise public boolean equals(Member m) gördüğünüz gibi bu iki metod birbirinden farklıdır. Java’da metod parametrelerini üst sınıftan altsınıflara çekemezsiniz. Yani Object.equals metodunu override etmek yerine yeni bir metod eklemiş olduk.

Burda belirtmek istediğim bir durum daha var. equals metodu Object referansı ile farklı Member referansı ile farklı sonuçlar verdi. Member.equals metodu üst sınıf olan Object in yerine geçemedi. Bu Liskov yerine geçme prensibi(Liskov Subsitution Principle)‘ne aykırıdır.

Şimdi geldik asıl sorumuza: @Override anotasyonu ne işimize yarayacak? Member.equals metoduna bu anotasyonu tanımlayalım.

Bu kodu derlemeye çalıştığnızda , method does not override or implement a method from a supertype hatasını alırsınız. Bu sayede bu anotasyon yanlışı compile zamanında size göstermiş oldu. Bu dikkatsizlik yayında daha kötü sonuçlara sebep olabilir.

Object sınıfı en çok bilinen sınıflardan biri olduğu için Object.equals elzem bir durum oluşturmayabilir. Fakat kendi yazdığınız interface ve üst sınıflar veya kullandığınız framework’lerde bu hatayı yapabilir, uygulamanızı tutarsız hale getirebilirsiniz. Yine yeni başlayanlar için düzgün bir Member.equals örneği de vereyim.

Bu kodu kendim yazmadım. Günümüzde Java IDE’leri bu kodu otomatik olarak üretebiliyor. Bu arada farklı bir yazıda anlatacağım fakat ek bilgi olarak belirteyim. Java’da equals metodu tanımlarken mutlaka hashCode metodunu da tanımlamalısınız. Java 7 ve sonrası için bunu yapmak oldukça kolay:

Bu sebeple bu anotasyonu kullanın, kullandırın!

Başka bir yazıda görüşmek üzere…

java annotation override liskov prensibi