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…