Java 8 / Interface
Java 8 ile birlikte Interface kavramına ciddi özellikler kazandırılmıştır. Aslında bu versiyona kadar Interface içerisinde soyut methodlar yazılır , implementasyon yapılmaz ve de tanımlanan tüm değişkenler static ve finaldır kavramlarını bilmekteydik.
Interfacelere artık body si olan metodlar ekleyebiliyoruz ve implement eden class ların bu metodu override etme zorunluluğu ortadan kaldırılıyor.
Aşağıdaki örnek ile açıklayalım :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package com.yelloware; public interface DefaultInterface { /** * Artık interfaceler içerisine body si olan metodlar yazılabiliyor. * Bu methodlar implement eden class tarafından ezilmek zorunda olmuyor. */ default String hasBody(){ return "bu metodun varsayılan halidir"; } } class ImplementerClass implements DefaultInterface { /** * default body metod burada ezilebiliyor. */ @Override public String hasBody() { return "bu metodun ezilmiş halidir"; } } class DefaultClass implements DefaultInterface { /** * Eskiden olsa implement edilen interface icerisindeki * tum metodlarin body lerini yazmamız beklenirdi. * Ama su an hasBody metodunu burada implement etmesek bile * bu class compile olabiliyor. */ } |
Yıllardır iş görüşmelerinde sorulan “Interface ile Abstract class arasındaki farklara örnek verir misiniz ?” şeklinde gelen soruya, interface içerisinde body si olan metod yazılamaz fakat abstract class lar içerisinde bu yapılabilir şeklinde cevap verdiniz biliyorum, artık sakın vermeyin 🙂
Interface lere eklenen bir diğer özellik de artık içerisine static metodlar eklenebilmesi .
Şöyle bir örnek ile açıklamaya çalışalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package com.yelloware; import java.util.function.Supplier; public interface StaticInterface { /** * Interface içerisinde static metod. */ static DefaultInterface createDefaultInterface(Supplier<DefaultInterface> pDefaultInterfaceSupplier) { return pDefaultInterfaceSupplier.get(); } public static void main(String[] args) { DefaultInterface implementerInterface = StaticInterface.createDefaultInterface(ImplementerClass::new); DefaultInterface defaultInterface = StaticInterface.createDefaultInterface(DefaultClass::new); /** * default metodu ezen sınıf */ System.out.println(implementerInterface.hasBody()); /** * default metodu ezmemis sınıf */ System.out.println(defaultInterface.hasBody()); } } |
Bu özelliklerin getirisi şu an için hala çeşitli platformlarda tartışılmaktadır. Abstract class larda olan metod implement edebilme özelliğinin aslında abstract classları taca atmadığı , hatta interface içerisinde gerçeklenemeyen basit impl işlemleri sebebi ile tasarımı karmaşık hale getirerek yaptığımız abstraction işlemlerinden bizi kurtarabileceği ve daha temiz tasarımlar yapılabileceği düşünülebilir.
Ayrıca default metodlar sayesinde, örneğin java.util.Collection sınıfı içerisine yeni eklenen forEach, removeIf gibi metodların , mevcutta bu interfacei implement eden diğer sınıfların compile olamaması gibi sorunlarının önüne geçmektedir. Geriye dönük uyumluluk için de geçiş özelliklerinden birisi gözüyle bakılmalıdır.
Java 8 ile ilgili yeniliklerden bahsetmeye devam edeceğiz.
Co-Founder At Yelloware
Hello there,
My name is Aly and I would like to know if you would have any interest to have your website here at yelloware.com.tr promoted as a resource on our blog alychidesign.com ?
We are in the midst of updating our broken link resources to include current and up to date resources for our readers. Our resource links are manually approved allowing us to mark a link as a do-follow link as well
.
If you may be interested please in being included as a resource on our blog, please let me know.
Thanks,
Aly