Java 1.5 ile kullanıma sunulan ve covariant return type ismini taşıyan bir yapı mevcuttur. Java 1.5 öncesi bir alt sınıf, bir üst sınıfın sahip olduğu metodu yeniden implemente etmek (method overriding) istediginde, bu metodun geri döndürdüğü veri tipinin, üst sınıftaki metot ile aynı olması gerekmekteydi. Bunun bir örneği aşağıda yer almaktadır.
package test.controller; import java.util.Map; import test.criteria.Criteria; public abstract class AbstractController implements Controller { public void executeFilter() { Map<String, String> map = createCriteria().getCriteriaMap(); } public abstract Criteria createCriteria(); }
Soyut (abstract) olan AbstractController sınıfı bünyesinde, alt sınıflarda implemente edilmek üzere createCriteria() isminde bir metot tanımlıyoruz. AccountTableController sınıfı bu metodu implemente etmektedir.
package test.controller; import java.util.HashMap; import java.util.Map; import test.criteria.MyCriteria; import test.model.Konto; public class AccountTableController extends AbstractController { private Account model = new Account(); public Criteria createCriteria() { Map<String, String> map = new HashMap<String, String>(); map.put("kontonr", model.getKontonr()); map.put("blz", model.getBlz()); return new Criteria(map); } }
Görüldüğü gibi AccountTableController.createCriteria() metodu Criteria tipinde bir degeri geri döndürmektedir. Bu metodun geri döndürdüğü değerin Java 1.5 öncesi Criteria tipinde olması gerekmektedir, çünkü üst sınıfta tanımlanmış olan bu metodun, üst sınıf bünyesinde geri döndürdüğü değer Criteria tipindedir.
Java 1.5 ile bu durum değişmiştir. Üst sınıfta yer alan bir metot alt sınıfta tekrar reimplement edilirse (method overriding), reimplemente edilen metodun geri döndürdüğü değerin tipi, üst sınıftaki metodun geri döndürdüğü sınıfın bir alt sınıfı olabilir. Bunun bir örneği aşağıda yer almaktadır.
package test.controller; import java.util.HashMap; import java.util.Map; import test.criteria.MyCriteria; import test.model.Konto; public class AccountTableController extends AbstractController { private Account model = new Account(); @Override public MyCriteria createCriteria() { Map<String, String> map = new HashMap<String, String>(); map.put("kontonr", model.getKontonr()); map.put("blz", model.getBlz()); return new MyCriteria(map); } }
MyCriteria, Criteria sınıfının bir alt sınıfıdır ve AccountTableController sınıfı implemente ettiği createCriteria() metodunun MyCriteria tipinde bir değeri geri döndürmesi sağlamıştır. Bu şekilde cast işlemi yapılmadan alt sınıfların daha zengin tipte verileri geri döndürebilmeleri amaçlanmaktadır.
EOF ( End Of Fun)
Özcan Acar
Java kategorisinden son yazılar
- Java 9 ile Modül Bazlı Yazılım - February 3rd, 2018
- 2015 Yılına Geldik, Hala Spring’le Birlikte İnterface sınıf mı Kullanmak Zorundayız? - May 23rd, 2015
- JVM Nasıl Çalışır Yazı Serisi - Java Dilinde Neden Göstergeçler (Pointer) Yok? - December 30th, 2014
- JVM Nasıl Çalışır Yazı Serisi - Java String Nesnelerinin Hafıza Kullanımı Nasıl Azaltılır? - September 18th, 2014
- Java’ya Nereden Başlamalıyım? - April 2nd, 2014
- java.lang.IncompatibleClassChangeError: Implementing class Nedir ve Analizi Nasıl Yapılır? - March 15th, 2014
- Yazılımcının Verimliliğini Artıran Eclipse Ayarları - January 1st, 2014
- Java Generics Get ve Put Prensibi - January 30th, 2013
- Uzaktan Eşli Programlama - September 30th, 2012
- Sorumluluk Sahibi Olmak - August 20th, 2012