y ca de m Java ile Nesne Merkezli ve Fonksiyonel Programlama w w w .s el so f t.a 4. Bölüm Arayüzler (Interfaces) Akın Kaldıroğlu www.javaturk.org Ocak2017 ca de m y Küçük Ama Önemli Bir Konu Ø Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm w Ø w Ø w .s el so f Ø t.a Ø haklarıSelsoft Yazılım,Danışmanlık,EğitimveTic.Ltd.Şti.’ne aittir. Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla kullanabilirsinizveisteyenlerihttp://www.selsoft.academy adresine yönlendirip,bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz. Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticari olsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması, buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyada sanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalinde lütfenbenimle,akin.kaldiroglu@selsoft.academy adresindeniletişimegeçin. Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeve eleştirilerinizibanailetmekistersenizçoksevinirim. BolJava’lıgünlerdilerim. www.selsoft.academy 2 ca de m y İçerik Ø Bubölümde şu konular ele alınacaktır: Ø Arayüz (interface)tipi, so f t.a Ø Arayüzlerin gerçeklenmesi, el Ø Yazılımtasarımındaarayüzlerin kullanımı, w .s Ø JavaSE8ile gelen yenilikler ve w Ø Geriçağırmametotları(callbackmethods)veisimsizsınıflar w (anonymousclasses) www.selsoft.academy 3 y ca de m t.a w w w .s el so f Tanımlar www.javaturk.org 4 y ca de m Interface- Arayüz Nedir? Ø İki şeyin birbirleriyle iletişimde bulundukları ortama arayüz (yadaarabirim)(interface)denir. el so f t.a Ø Örneğin dil (language),yüz, mimikler, hareketler ve tavırlar insanlar arası iletişimin ortamıdır,yani insanların arayüzüdür. w w w .s Ø Yazılımınnesneleridebirbirleriylearayüzleriüzerinden iletişimdebulunurlar. www.javaturk.org 5 y ca de m İmzaveArayüz(Tekrar) el so f t.a Ø Birmetotun,isimveparametrelistesindenoluşanbilgisine imza (signature)denir. Ø Dönüşdeğerivefırlatılansıradışıdurumlarimzayadahil değildir. Ø Birmetotun,isim,parametrelistesi,dönüşdeğeritipive fırlattığısıradışıdurumlardanoluşanbilgisinearayüz (interface)denir. w .s <niteleyici>* <dönüş tipi> <isim>(<Parametre>*) throws <exception>* public double squared(double arg) throws IllegalArgumentException w w public double squared(double arg) throws IllegalArgumentException imza (signature) arayüz(interface) www.selsoft.academy 6 ca de m y MetotArayüzü t.a Ø Metotarayüzü,ometodunneyaptığınıifadeedenbilgisidir. Ø Arayüz,metodungörevininasılyaptığınıgösteren gerçekleştirmesi(implementation)ilebirliktemetoduniki parçasındanbirisidir. Ø Gerekirsearayüzbilgisidokümantasyoniledesteklenir. w .s el so f /** * Method that calculates the square of a double parameter. * @param Parameter whose square to be calculated. * @return Square of the parameter passed. * @throws IllegalArgumentException Thrown when a negative argument supplied. */ w w public double squared(double arg) throws IllegalArgumentException{ if(arg < 0) throw new IllegalArgumentException(“Negative argument.”); else return Math.sqrt(arg); } www.javaturk.org 7 y ca de m NesneninArayüzü(Tekrar) Ø Birnesneninsahipolduğumetotarayüzlerinintamamına,o nesneninarayüzüdenir. w w w .s el so f t.a Ø Dolayısıylanesnearayüzü,nesneninsınıfındatanımlanan metotarayüzlerinintoplamıdır. www.selsoft.academy 8 y ca de m t.a w w w .s el so f Arayüz (Interface) www.javaturk.org 9 ca de m y Interface– Arayüz- I t.a Ø Arayüz (interface),enkısatanımıyla,tümmetotlarısoyut olansınıftır. Ø Arayüzlertanımlanırkeninterfaceanahtarkelimesi kullanılır. w .s el so f Ø Arayüzlerinmetotlarıotomatikolarakhempublic hemde abstract olur. Ø Aşağıdakitanımlarbirbirlerineeşittirler. w public interface Worker{ public interface Worker{ public abstract void work(); } w } void work(); www.javaturk.org 10 y ca de m Interface– Arayüz- II w .s el so f t.a Ø Arayüz (interface)sadecearayüzsağlar,nedurumnede gerçekleştirmesağlamaz. Ø Bubirbeyazyalandır,dolayısıylaenazındanbunuşimdilik böylekabuledelim. Ø ÇünküJavaSE1.8ileartıkarayüzlerde gerçekleştirme verilebilir! Ø Dolayısıylabundansonraaksisöylenenekadararayüzleri, JavaSE1.8ilegelenyeniliklerigözönünealmadan,hala JavaSE1.7sürümündeolduğugibiişleyeceğiz. w w Ø Yaniarayüzlerdeherhangibirgerçekleştirmeolamayacağını farzedeceğiz. www.javaturk.org 11 y ca de m Interface– Arayüz- III t.a Ø Arayüzdeki tümmetotlarabstract olmakzorundadırlar, Ø Arayüzünmetotlarınagerçekleştirmeverilemez. el so f Ø Buyüzdenbuyapılarainterface (arayüz)denilmektedir. Ø Arayüzlerbuanlamdasadeceform – şekil yani“ne’lik” sağlayanyapılardır,içerikyani“nasıl’lık”sağlamazlar. w w w .s Ø Arayüzlerin kurucusu (constructor)yokturvenesneside oluşturulamaz. www.javaturk.org 12 y ca de m Implementing AnInterface so f t.a Ø Bundandolayıbirsınıf,birarayüzünalttipiolurken “implements”anahtarkelimesinikullanır. Ø Yanibirsınıf,birarayüzüimplement eder(yerinegetiriryada gerçekleştirir). Ø Birarayüzü gerçekleştirmekdemek,metotlarınıoverride ederekonlaragerçekleştirme(implementation)vermek demektir. public interface Worker{ w .s } el void work(); w w public class Employee implements Worker{ void work(){ ... } } public class Boss implements Worker{ void work(){ ... } } www.javaturk.org 13 ca de m y Worker.java veEmployee.java w w w .s el so f t.a Ø factory1 paketi. www.javaturk.org 14 ca de m y ArayüzveMiras so f t.a Ø Arayüzler,sorumluluklaragerçekleştirme sağlamadıklarından,kendilerindenbuarayüzleridevralan altsınıfların,arayüzdeki tümmetotlaragerçekleştirme vermelerigereklidir. Ø Çünküarayüzdeki tümmetotlarsoyutturlar. w w w .s el Ø Aksitaktirde,yanialtsınıf,arayüzden devraldığıbirmetoda bilegerçekleştirmevermezse,altsınıfınsoyut (abstract) tanımlanmasıgereklidir. Ø Çünküsınıfhalasoyutmetodasahiptir. www.javaturk.org 15 y ca de m SözleşmeveYüklenici Ø Arayüz,sorumluluklarınsıralandığıbirsoyutyapıdır. Ø Birarayüzügerçekleştirenbirsınıf,arayüzdeki metotlarabirer so f t.a gerçekleştirmesağlamaklayükümlüdür. w .s el Ø Bu,arayüzünbirsözleşme (contract)yadaprotokol (protocol),gerçekleştirensınıflarınisebireryüklenici (implementor)olaraknitelendirilmesinedeizinverir. w w Ø Aynıarayüzügerçekleştirensınıflar,aynısözleşmeyiyerine getirenfarklıyüklenicilerdir. www.javaturk.org 16 ca de m y ArayüzveIs-A Ø Arayüzileonugerçekleştirensınıflararasındais-ailişkisi tabiolarakvardır. so f t.a Ø Bundandolayıarayüzün,polymorphism,upcasting ve downcasting açısından,sınıflardanhiçbirfarklıyoktur. w .s el Ø Birarayüz,kendisinigerçekleştirensınıflarınüsttipidir. w w Ø Aralarındakitemelfark, soyutluk-somutlukspektrumundaki yerleridir. www.javaturk.org 17 ca de m y Test.java w w w .s el so f t.a Ø factory1 paketi. www.javaturk.org 18 y ca de m ArayüzveYetkinlikler Ø Arayüzlerin“is-a”hiyerarşisindebirüsttipolarakgörülmesi yanında,yetkinlikkazandırmasıdasözkonusudur. w .s el so f t.a Ø Arayüzler,tanımladıklarısoyutdavranışlarilealtsınıflarına yetkinlikkazandırırlar. Ø Bunda,birsınıfınpekçokarayüzüyerinegetirmesiderol oynar. w w Ø Sınıfların,yerinegetirdikleripekçokarayüzilepekçok yetkinliği(ability)kazandığıdüşünülür. www.javaturk.org 19 y ca de m ArayüzveCan-Do- I t.a Ø Busebeplezamanzamanarayüzler,“able”sontakısıyla isimlendirilirler: Ø Budurumdaaltsınıflarilearayüzleriarasındakiilişki“cando”olarakdaokunabilir. el so f public interface Doable{ void doIt(); } w w w .s public interface Payable { double calculatePrice(); double calculateTax(); void pay(double price); } www.javaturk.org 20 y w w w .s el so f t.a ca de m ArayüzveCan-Do- II www.javaturk.org 21 ca de m y Doable.java vePayable.java w w w .s el so f t.a Ø canDo paketi. www.javaturk.org 22 y ca de m Arayüzlerin Kullanımı metotarayüzü sağlarlar. w w w .s el so f Ø Çünkü arayüzler sadece t.a Ø Arayüzler daha önce ifade ettiğimiz “programtoan interface,notanimplementation”prensibinin uygulanması için enidealyapıdırlar. www.javaturk.org 23 ca de m y Calculator.java Ø math paketi. t.a Ø İhtiyacagörefarklıtürdetekargümanlımatematiksel fonksiyonlarasahipolabilenbirCalculator düşünün. el so f Ø Matematikselfonksiyonların,Calculator’e eklenebilmesi (pluggable)nasılsağlanabilir? w w w .s Ø “Programto interface,notanimplementation”prensibinin uygulamasınıgözlemleyin. www.javaturk.org 24 ca de m y Uygulama w w w .s el so f t.a Ø Celcius,FahrenheitveKelvinsıcaklıkderecelendirme sistemleriarasındadönüşümyapacakbiryapıyıarayüz kullanaraktasarlayın. www.javaturk.org 25 y ca de m t.a w w w .s el so f Arayüz ve Miras www.javaturk.org 26 ca de m y PekÇokArayüzGerçekleştirme Ø Birsınıfaynıandabirdenfazlaarayüzügerçekleştirebilir. el so f t.a Ø Bununiçinsınıftanımlanırken,implements’tensonra arayüzler virgülilelistelenir. Ø Budurumdasınıfın,yerinegetirdiğiarayüzlerdendevraldığı tümmetotlaragerçekleştirmevermesigerekir. Ø Aksitaktirdeosınıfsoyut olmakzorundadır. w .s public class Employee implements Worker, Schedulable{ void work(){ ... } w } w public schedule(){ ... } www.javaturk.org 27 ca de m y PekÇokArayüzGerçekleştirme t.a Ø Birsınıfhembirsınıftanmirasdeviralırkenbiryadadaha çokarayüzü yerinegetirebilir. so f public class Employee extends Person implements Worker, Schedulable{ el public void live(){ ... } w .s public void work(){ ... } w } w public schedule(){ ... } www.javaturk.org 28 ca de m y Employee.java w w w .s el so f t.a Ø factory2 paketi. www.javaturk.org 29 y ca de m MirasaYenidenBakış Budurumdahemarayüzhemdegerçekleştirmedevralınır: Üyedeğişkenlervemetotlar. so f Ø t.a Ø Soyutsınıfvearayüzmekanizmalarındansonramirasile ilgiliolarakşuayrımyapılabilir: Ø Gerçekleştirmedevralma (implementationinheritance):Bir sınıftan“extends”ilemirasdevralınmasıdır. Ø Arayüzdevralma (interfaceinheritance):Birarayüzden el “implements”ilemirasdevralınmasıdır. w .s Budurumdasadecearayüzdevralınır,hiçbirgerçekleştirme devralınmaz,(enazındanşimdilikböylekabuledelim). Üyemetotlarınarayüzleri. w w Ø www.javaturk.org 30 ca de m y JavaAPIsindeki Arayüzler- I w w w .s el so f Ø Bazıları: Ø java.lang.Comparable Ø java.lang.Runnable Ø java.util.Collection t.a Ø JavaAPI’sindepekçokarayüzvardır. www.javaturk.org 31 ca de m y JavaAPIsindeki Arayüzler- II w .s el so f Ø Örneğin Ø java.io.Serializable Ø java.lang.Cloneable Ø java.util.RandomAccess t.a Ø JavaAPI’sindekiarayüzlerdenbazılarındahiçmetotyoktur. w w Ø Birarayüzde hiçmetotolmamasınasılaçıklanabilir? www.javaturk.org 32 y ca de m ArayüzMetotlarınaErişim Ø Arayüzmetotlarıpublic erişimesahiptirler. so f t.a Ø Dolayısıyla,bumetotlaraltsınıflardagerçekleştirilirkende public olmakzorundadırlar. w .s el Ø Çünkümetotlaroverrideedilirken,dahakısıtlayıcıbirerişim belirteciiletanımlanamazlar. w w Ø Yerinegeçebilme(substitutability)özelliğiarayüzveonun altsınıflarıiçindegeçerlidir. www.javaturk.org 33 ca de m y Arayüz- Durum Ø Arayüzler durum(state)dasağlamazlar. t.a Ø İlkbakıştabirarayüzde durumtanımlanıyormuşsanılır: so f public interface Worker{ w .s } el String name = "Ahmet"; int year = 10; w w Ø Amabualgıgeçicidir, www.javaturk.org 34 y ca de m Arayüz– Sabiteler w w .s el so f t.a Ø Arayüzde tanımlanacaktümalanlarotomatikolarakpublic, statik vefinal olurlar. Ø Buyüzdenalanlariçinpublic,static vefinal dışındabelirteç (modifier)kullanılamaz. Ø Vetümalanlarabirilkdeğervermekzorunludur. Ø Buyüzdendebüyükharflerleyazılıp,varsakelimelerarası“_” ileayrılır:NEXT_YEAR Ø Budurum,ironik birşekilde,arayüzlerisadecesabiteleri toplayanbiryapıhalindekullanılmasınasebepolur. Ø java.io.ObjectStreamConstants böylebirarayüzdür. w Ø Arayüzlerin buşekildekullanımınınalternatifienum tipidir. www.javaturk.org 35 w w w .s el so f t.a ca de m y Months.java www.javaturk.org 36 y ca de m Arayüz– SoyutSınıf Ø Arayüzlerinbirdurumasahipolmamalarındandolayı,soyut sınıflarsıklıklaarayüzlerinalttipleriolur. w w w .s el so f t.a Ø Budurumdaarayüz hiyerarşininortakdavranışlarını içeriken,soyutsınıfhiyerarşiiçingereklidurumusağlar. Ø Soyutsınıfgeneldedeviraldığısoyutmetotlara gerçekleştirmevermezsadeceset/get metotlarınısağlar, Ø Bazensoyutsınıflarınarayüzden devraldıklarımetotlara genel-geçerbirdavranışsağladığıdagörülür. www.javaturk.org 37 ca de m y Shape.java w w w .s el so f t.a Ø BuörnektebirShape hiyerarşisielealınmaktadır. www.javaturk.org 38 y ca de m ArayüzveKurucular t.a Ø Arayüzlerinkurucularıyoktur. Ø Bu,arayüzlerinhiçdurumsağlamıyorolmalarındandolayı anlaşılabilir. el so f Ø Buyüzdenarayüzügerçekleştirensınıflarınkurucularında, arayüzden kaynaklanansuper()çağrılarıbulunmaz. w w w .s Ø Altsınıflarınkurucularındakisuper()çağrıları,miras devraldığısınıflariçindir. www.javaturk.org 39 ca de m y ArayüzlerArasındaMiras- I so f t.a Ø Arayüzlerdebirbirlerindenmirasdevralabilirler. Ø Budurumdabirarayüz,kendisindenmirasdevraldığıdiğer arayüzügenişletir(extends). Ø Arayüzlerarasındakimirasilişkisindeextends anahtar kelimesikullanılır. el Ø Budurumdaaltarayüzügerçekleştirensınıfın,arayüzün devraldığımetotlaradagerçekleştirmevermesigerekir. w .s public interface Worker{ void work(); } w w public interface HardWorker extends Worker{ void workHard(); } www.javaturk.org 40 ca de m y Worker.java veHardWorker.java w w w .s el so f t.a Ø org.javaturk.oofp.ch03.interfaces.factory.extensionpaketi www.javaturk.org 41 ca de m y ArayüzlerArasındaMiras- II Ø Birarayüz,aynıandanbirdenfazlaarayüzden mirasdevir alabilir. w w w .s el so f t.a Ø Budurumdamirasalınanarayüzler,ard-ardavirgülile ayrılaraksıralanır. www.javaturk.org 42 y ca de m ABiggerInterface.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04. extending paketi. www.javaturk.org 43 ca de m y Uygulama- I w w w .s el so f t.a Ø Birkurumticaretiniyaptığıürünlerleilgiliolarakyazılım sistemindeşöylebiryapıkurgulamıştır: www.javaturk.org 44 ca de m y Uygulama- II w w .s el so f t.a Ø Sonrasında bu kurumun iş yapışında aşağıdaki değişiklikler olmuş ama var olan Productyapısının bunlara izin vermediği gözlemlenmiştir. Ø Danışmanlık hizmeti sağlama (Location’u yok), Ø Kurumdaki eskimiş bilgisayarları satma (Productdeğil), Ø Ürettikleri ürünlerden özel günlerde hediye verme (Product’ın fiyatı var). Ø “Kurum,bu tür değişiklikleri daha sistemi tasarlarken öngörerek baştan daha esnek bir sistem kurgulanmalıydı” diyorsanız,bu sistemi baştan bu şekilde tasarlayın. w Ø Çözümünüzünsınıfdiyagramınıçizinvekodunuyazın. www.javaturk.org 45 y ca de m t.a w w w .s el so f Tip Kavramı (Concept of Type) www.javaturk.org 46 ca de m y TipKavramı Ø Programlamadillerindetip (type),alınabilecekdeğerler kümesidir(setofpossible values). so f t.a Ø Java’dailkel (primitive)vekarmaşık yadareferans (complex yadareference)tiplervardır. w .s el Ø Karmaşıktip ilebaşındabuyanakavramıylahepsomut sınıflarıkastettik. w w Ø Artık,tip olaraksomutsınıflaryanındasoyutsınıflarve arayüzlere desahibiz. www.javaturk.org 47 ca de m y TipSpektrumu t.a Ø Soyutvesomutolaraksınıflarilearayüzler düşünüldüğünde,birtipspektrumdanbahsedilebilir. Ø Buspektrumdafarklıtiplerfarklıyerleresahiptirler. el class w .s Concretion so f Type Spectrum abstract class interface implementing w w inheriting Abstraction www.javaturk.org 48 ca de m y ÇokTipliYapılar t.a Ø Birhiyerarşide,somut-soyutsınıfvearayüzolarakbirden fazlaüsttipesahipolanbirnesneninbirdenfazlatipivar demektir. el so f Ø Venesne,otiplerinherbirisindenolanreferanslariletemsil edilebilir. w w w .s Ø Aynınesneninhangibağlamdahangitipiniortaya koyduğunubelirleyenşeydeonesneyiobağlamdatemsil edenreferanstır. www.javaturk.org 49 y ca de m t.a so f el w .s w w SeaPlane nesnesinin kaç tipi vardır? www.javaturk.org 50 www.javaturk.org 51 w el w .s w ca de m t.a so f y ca de m y TestFlyer.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04.flyerpaketi. www.javaturk.org 52 ca de m y Polymorphism Ø Arayüzlerindemirashiyerarşisinekatılmasısayesinde,çok tiplinesneleroluşturulabilir. w .s el so f t.a Ø Nesneleringerçekleştirmesibirtanedir,odasınıfıdır.Ama nesnelerinpekçoktipivardır. Ø Busebeplebirsınıfınnesnesi,sahipolduğuhertipe dönüştürülebilir(upcasting). Ø Aynınesnebuşekildefarklıbağlamlardafarklıtiptegörünür. w Ø Buiseçokşekilliliğin (polymorphism)tanımıdır. w Ø Budurum,gerçekliğidahaiyiresmetmeyeyarar. www.javaturk.org 53 y ca de m t.a w w w .s el so f Geri Çağırma Metotları (Callback Methods) www.javaturk.org 54 y ca de m GeriÇağırma(CallBack)- I so f t.a Ø Yazılımsistemlerindesıklıkla,birbuttonuntıklanmasıyada birkullanıcınınsistemikullanmayabaşlaması(login)gibi bazıolaylarıntakibigereklidir. Ø Buamaçlagenelolarak,olayınkaynağıolannesneye,olayın olduğunubildirmesiiçinbirfonksiyongeçilir. w w w .s el Ø İlgilenilendurumoluştuğundadanesne,kendisinegeçilen fonksiyonuçağırır. Ø Bumekanizmayageriçağırma (callback),geriçağrılan metodadageriçağırmametodu (callbackmethod) denir. Ø Observer (event-notificationyadapublisher-subscriber) tasarımkalıbıbuproblemiveçözümünütarifeder. www.javaturk.org 55 ca de m y GeriÇağırma(CallBack)- II so f t.a Ø GeriçağırmayıJava’dakurgulamakiçinolayınkaynağına, fonksiyondeğil,üzerindebelirlibirmetotolannesnegeçilir. Ø ÇünküJavanesnemerkezlidirvenesnegeçilmesidurumuçok dahagenişbirhareketalanısağlar. w .s el Ø Budurumdaolayınkaynağıolannesnenin,olayınolması durumundahangimetoduçağıracağınıbilmesigerekir. w w Ø BusebepleJava’dageriçağırmanesneleri,üzerindegenelde birtanegeriçağırmametodubulunduranarayüzlerden türetilir. www.javaturk.org 56 y ca de m TimerExample.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04.callBack paketi. www.javaturk.org 57 y ca de m t.a w w w .s el so f İsimsiz Sınıflar (Anonymous Classes) www.javaturk.org 58 ca de m y İsimsizSınıflar so f t.a Ø Geneldegeriçağırmametotlarınınüzerindebulunduğu sınıflarıntekkullanımlıkbirnesnesineihtiyaçduyulur. Ø Yaniarayüzügerçekleştirensınıfınbirteknesnesineihtiyaç vardırvebunesnesadecebiryerdekullanılır. w .s el Ø BudurumdaJava,arayüzüyerinegetirensınıfınisimsizbir şekilde,hızlıcaoluşturulmasınavebununyapıldığıyerde tekbirnesnesininyaratılıpkullanılmasınaizinverir. w w Ø Buşekildeoluşturulansınıflaraisimsizsınıf(anonymous class)denir. www.javaturk.org 59 y ca de m İsimsizSınıflar- I t.a Ø İsimsizsınıflarsıklıklaolayları(event)yakalamada kullanılırlar. Ø Çünküçoğuzamanözelbirdurumaişaretedenolaynesnesi sadecebiryerdeyakalanırvegereğiyapılır. so f Timer t = new Timer(1_000, new ActionListener() { }); w .s el @Override public void actionPerformed(ActionEvent e) { ... } w w Ø ÖrnektekiActionListener, sadece actionPerformed() metodunasahipbirarayüzdür. www.javaturk.org 60 y ca de m TimerExample.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04.anonymous.timer paketi. www.javaturk.org 61 y ca de m İsimsizSınıflar- I t.a Ø YakalanansıklıklaGUIolaylarıdır.. Ø BenzerşekildeçoğuzamanbirGUIbileşeninin durumundakibirdeğişikliğeişaretedenolaynesnesisadece biryerdeyakalanırvegereğiyapılır. so f button.setOnAction(new EventHandler<ActionEvent>() { w }); w .s el @Override public void handle(ActionEvent event) { ... } w Ø ÖrnektekiEventHandler, sadecehandle() metoduna sahipbirarayüzdür. www.javaturk.org 62 y ca de m MyApplication.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04.anonymous.event paketi. www.javaturk.org 63 y ca de m İsimsizSınıflar- II t.a Ø Sınıflar,tanımlamaya(classdeclaration)sahipoldukları haldeisimsizsınıflarifadedirler(expression). Ø İsimsizsınıfifadesi,birkurucuçağrısınabenzeramaiçinde tekrartanımlanan(override)metotyadametotlarvardır. w w w .s el so f Ø İsimsizsınıflarhemarayüzlerigerçekleştirmedehemde sınıflarıgenişletmedekullanılabilirler. Ø İsimsizsınıflargeneldesadecebirmetotasahiparayüzleri gerçekleştirmedekullanılmalarınarağmenbirdenfazla metoduyenidentanımlayacakşekildekullanılabilirler. Ø Olayyapılarındaçağrılacakmetotbirtaneolduğundan, geneldetekmetodutekrartanımlamadakullanılırlar. www.javaturk.org 64 y ca de m İsimsizSınıflar- III Ø İsimsizsınıfifadesişöyledir: Ø new operatörü, Ø Gerçekleştirilecekarayüzünyadagenişletileceksınıfınismi, t.a Ø Sınıfbloğu. so f Ø new operatöründensonragelentipinsınıfolmasıdurumunda, kurucuyageçilecekparametreler desıralanabilir. Eğertiparayüzise,arayüzlerinkurucularıolmadığından,sanki varsayılankurucuçağrılıyormuşgibiiçiboşikiparantezbulunur. el Ø w w w .s Ø İsimsizsınıflarbirerifadeolduklarından,bloklarındabaşka ifadelerolamaz,sadecemetotgibibaşkabloklarolabilir. Ø İsimsizsınıfifadesi,arayüzgerçekleştirmesindenew operatöründensonraarayüzünvarsayılankurucusunu çağırıyorbirgörüntüyesahipolduğundantuhafgörünür. www.javaturk.org 65 ca de m void doIt(); y public interface DoerInterface { void doThat(); } so f t.a new DoerInterface(){ { System.out.println(”Instance initializer block."); } w .s el @Override public void doIt(){ System.out.println(”I!ll always do it :)"); } w w @Override public void doThat(){ System.out.println("I’ll always do that :)"); } }).doIt(); www.javaturk.org 66 ca de m y AnonymousDoesClassTest.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04.anonymous.doer paketi. www.javaturk.org 67 y ca de m İsimsizSınıflar- IV Ø İsimsizsınıflar,içindebulunduklarısınıfınüyelerine erişebilir. w .s el so f t.a Ø İsimsizsınıflar,içindebulunduklarıbloğunyerel değişkenlerinefinal yadadeğerideğişmediği(effectively final) hallerdeulaşabilir. Ø Budurumdadayereldeğişkenideğiştiremez. w w Ø İsimsizsınıflar,sabiteolmalarışartıylastatikalanlar tanımlayabilirler. www.javaturk.org 68 y ca de m İsimsizSınıflar- V so f t.a Ø İsimsizsınıflarayrıcaşunlarıtanımlayabilirler: Ø Alanlar, Ø Yerelsınıflar(localclasses), Ø Üsttipindeolmayanmetotlar, Ø Nesneilkdeğerblokları w w w .s el Ø İsimsizsınıflar,statikilkdeğeratamabloklarıileüye arayüzlertanımlayamazlar. www.javaturk.org 69 ca de m y WeirdAnonymousDoesClassTest.java w w w .s el so f t.a Ø org.javaturk.oofp.ch04.anonymous.doer paketi. www.javaturk.org 70 y ca de m t.a w w w .s el so f Java SE 1.8 Yenilikleri www.javaturk.org 71 y ca de m JavaSE1.8Yenilikleri so f t.a Ø JavaSE1.8ilearayüzlere(interface)ikiciddideğişiklik yapıldı. Ø Budeğişikliklerşunlardır: Ø default (varsayılan)metotlar, Ø static metotlar w w .s el Ø Buikitürmetotda,şuanakadarsöylenen“arayüzler sadeceşekil/formsağlar,gerçekleştirmesağlamaz” prensibinidelenyeniliklerdir. w Ø Buikidurumundaönemlisebeplerivardır. www.javaturk.org 72 y ca de m t.a w w w .s el so f Varsayılan Metot (Default Method) www.javaturk.org 73 y ca de m ArayüzveGerçekleştirme Ø Dahaönce“Arayüzlersadeceform– şekilsağlayan yapılardır,içeriksağlamazlar.” dendi. so f t.a Ø JavaSE8ilebirliktearayüzlerde ciddideğişiklikleryapıldı. w w w .s el Ø Budeğişikliklerdenikisiarayüzlerinsadeceşekilyanimetot arayüzüdeğilaynızamandaiçerikyanigerçekleştirmede sağlamasınaizinverdi. www.javaturk.org 74 y ca de m ArayüzüGüncellemek so f t.a Ø Yazılankodlardabulunanarayüzlerin,tabiolarak, sistemdekisınıflargibizamanzamandeğişmesigerekir. Ø Birarayüze yenibirmetoteklendiğinde,oarayüzden miras devralanbütünsınıflarınometodugerçekleştirmeleri gerekir. w w w .s el Ø Budurumözelliklekütüphaneler(library)içinproblemlidir: Ø Dünyayadağılmışolanbirkütüphanedekibirarayüze metot eklemek,okütüphaneyikullananbütünkodlarıetkiler. Ø Kullanıcılarınkütüphaneyiyenisürümeçekmeleri,oarayüzü kullanansınıflara,yenimetotlarıeklemelerinigerektirir. www.javaturk.org 75 ca de m y DefaultMethod–VarsayılanMetot- I Ø JavaSE8ilebirliktearayüzlere defaultmethod (varsayılan metot)eklemeimkanıgeldi. w .s el so f t.a Ø Defaultmetot,“default”kelimesiyletanımlanırvearayüzde birgerçekleştirmeyesahipolur. default void newMethod(){ ... } w w public interface Worker{ void work(); double calculateSalary(); } public interface Worker{ void work(); double calculateSalary(); } www.javaturk.org 76 ca de m y DefaultMethod–VarsayılanMetot- II t.a Ø Dolayısıyla,eklenenvedefault olaraktanımlananyeni metodun,arayüzünaltsınıflarındagerçekleştirilmesine gerekkalmaz. w w w .s el so f Ø Diğertümmetotlargibivarsayılanmetotlardadaimapublic olaraktanımlıdırlar. www.javaturk.org 77 y ca de m Binary Compatibility- I t.a Ø Varsayılanmetot,birarayüzünün eskisürümünükullanan biryapıyla,yenisürümüarasındakiuyumluluğubozmamak üzereçıkarılmışbirözelliktir. w w w .s el so f Ø Binary compatibility (ikili?uyumluluk),eskidenbirlikte çalışanikiyapıdanbirisinindeğişmesinerağmen,yeni sürümünündiğeryapıylahalauyumlubirşekilde çalışabilmesinedenir. Ø Yaniuyumluluk,derlenmişyapılar,.classdosyaları seviyesindedir. www.javaturk.org 78 y ca de m Binary Compatibility- II t.a Ø Eğerbirprojedekibirarayüze yenibirmetotekledikten sonraderleyipprojedeeklerseniz,varolanyapılar,arayüzün yenisürümüyleçalışmayadevamedeceklerdir. el so f Ø Amaoyapılar,arayüze eklenenyenimetodu kullanamayacaklardır. w w w .s Ø Bunabinary compatibility denir. www.javaturk.org 79 y ca de m TestCompatibility.java - I so f 1. Sürüm t.a Ø FootballPlayer arayüzünün 1.sürümüileçalışan AverageFootballPlayer veTestCompatibility, FootballPlayer’a yenibirmetoteklenmesiyleoluşan2. sürümüiledeçalışmayadevameder. w .s el public interface FootballPlayer{ void play(); } 2. Sürüm public interface FootballPlayer{ void play(); void behaveEthically(); } w w public class TestCompatibility { public static void main(String[] args) { FootballPlayer player = new AverageFootballPlayer(); player.play(); } } www.javaturk.org 80 y ca de m SourceCompatibility so f t.a Ø Biröncekiörneksource compatibility (kaynak uyumluluğu)sağlamaz, çünküyenilenenarayüzükullanan yapılartekrarderlenirse,varolanmetoduimplement etmelerigerekir. el Ø Varsayılanmetotlar,budurumiçingeliştirilmişlerdir. w w w .s Ø Eğeryenieklenenmetotvarsayılanmetotise,buyeni metodun,altsınıflartarafındangerçekleştirilmesinegerek kalmaz. www.javaturk.org 81 y ca de m TestCompatibility.java - II t.a Ø AmaTestCompatibility,FootballPlayer’a yenieklenenbir metoduAverageFootballPlayer nesnesiüzerindeçağıramaz, çünküAverageFootballPlayer tekrardanderlenmelidir. w w w .s el so f Ø AverageFootballPlayer sınıfı,yenieklenenmetodu gerçekleştirmedentekrarderlenebilirçünküyenieklenen metotvarsayılanmetottur. www.javaturk.org 82 y ca de m NedenVarsayılanMetot? t.a Ø Varsayılanmetot,birarayüzüneskisürümünükullananbir yapıyla,yenisürümüarasındakaynakuyumluluğusağlamak üzereçıkarılmışbirözelliktir. w .s el so f Ø Arayüzünyenisürümündegelenyenimetotlarınvarsayılan metotolaraktanımlanmasıhalinde,oarayüzleri gerçekleştirensınıflarıneklenenyenimetodu gerçekleştirmelerinegerekkalmaz. w w Ø Budurumarayüzüilegerçekleştirensınıflararasında“geriye dönükuyumluluk”(backward compatibility)sağlar. www.javaturk.org 83 ca de m y ÇokluMiras- I w w w .s el so f t.a Ø Eğerbirsınıfbirdenfazlaarayüzden mirasdevralırveo arayüzleraynıdefaultmetodasahipolurlarsaneolur? www.javaturk.org 84 ca de m y ÇokluMiras- II Ø BudurumJava’daderlemehatasıverir. so f t.a Ø Budurumada“diamond problem”yada“deadly diamond ofdeath”denir. w w w .s el Ø Java’dabuhatayıçözmenintekyoluvardır: Ø Altsınıfındevraldığıdefault metoduimplement etmesi www.javaturk.org 85 w w w .s el so f t.a ca de m y multipleInheritance Paketi www.javaturk.org 86 ca de m y Seçenekler Ø Dolayısıylavarsayılanmetodasahipbirarayüzden miras devralmakisteyenbirsınıfınönündeşuüçdurumvardır: t.a Ø Varsayılanmetoduolduğugibidevralıp,overrideetmemek, so f dolayısıylavarsayılangerçekleştirmeyikullanmak, el Ø Varsayılanmetoduabstract olaraktekrartanımlayıp,abstract w .s birsınıfolmak, w w Ø Varsayılanmetoduoverrideetmek. www.javaturk.org 87 ca de m y SoyutMetotDefaultGerçekleştirme so f t.a Ø Birarayüz,diğerarayüzden extends ilemirasyoluyla devraldığıbirmetodagerçekleştirmeveriponudefault olaraktanımlayabilir. Ø Buşekildesoyutolarakdevralınanmetot,devralan arayüzde gerçekleştirilmişolur. public interface Artist { el void play(); w .s } public interface Actor extends Artist{ w w default void play(){ System.out.println("Actor plays!"); } } www.javaturk.org 88 ca de m y DefaultGerçekleştirmeSoyutMetot t.a Ø Birarayüz,diğerarayüzden extends ilemirasyoluyla devraldığıbirdefault metodutekrardefault yaabstract olaraktanımlayabilir. public interface Artist { so f default void play(){”Artist plays!"} el } w .s public interface Musician extends Artist{ void play(); w } w public abstract class Pianist implements Musician{ } www.javaturk.org 89 w w w .s el so f t.a ca de m y multipleInheritance.v2Paketi www.javaturk.org 90 y ca de m GaripBirDurum! so f t.a Ø Davranışlarıntamolaraktanımlandığı(definition)yer değildir,davranışlararayüzlerde tanıtılır,sınıflarda tanımlanır. Ø Buyüzdenbuyapılara,sadecearayüzsağladığıiçin“arayüz” yada“interface”denir. w w w .s el Ø Amayukarıdakidurumdatanımlamayıyapanarayüzdür, tanıtımıyapanisesınıf! Ø “play()”metoduArtistarayüzünde tamolarak tanımlanıyoramahiyerarşininenaltındakiPianist sınıfıise aynıdavranışıtanıtıyor,yaniüsttipiolanMucisian arayüzünden abstract olarakdevralıyoramabir gerçekleştirmevermiyor. www.javaturk.org 91 ca de m y BirNokta Ø java.lang.Object sınıfındaki(hashCode(), toString() vb.)metotlaraslabirarayüzüzerinde t.a varsayılanolantanımlanamaz. el so f Ø Eğerböyleolsaydı,oarayüzüntümaltsınıflarındabu gerçekleştirmekullanılırdı. w w w .s Ø Amabumümkündeğildir,mümkünolanbumetotları hiyerarşininüstündeki sınıftaoverrideetmekvealt sınıflarınaynenkullanmasınaizinvermektir. www.javaturk.org 92 ca de m y JavaAPIArayüzVarsayılanMetotları Ø JavaAPI’sindevarsayılanmetotlarasahiparayüzlerden bazılarışunlardır: t.a Ø java.util.Collections w w w .s el so f Ø java.sql.Statement www.javaturk.org 93 y ca de m t.a w w w .s el so f Statik Metot (Static Method) www.javaturk.org 94 y ca de m Arayüzde StatikMetot- I t.a Ø JavaSE8ilebirliktearayüzüzerindestatikmetot tanımlanabilir. Ø Bununiçinyine“static”anahtarkelimesikullanılır. void print(); so f public interface Printable { w .s el default void format(){ System.out.println("Printable is being formatted."); } w } w static void startPrinting(){ System.out.println("Printing has been started."); } www.javaturk.org 95 y ca de m Arayüzde StatikMetot- II Ø Diğertümarayüzmetotlarıgibistatikmetotlardadaima public olaraktanımlıdırlar. w w w .s el so f t.a Ø Arayüzüzerindekistatikmetotlararayüzü genişleten arayüzleryadagerçekleştirensınıflartarafından devralınmazlar,buyüzdenstatikmetotlarsadecevesadece tanımlandığıarayüzüzerindeçağrılırlar. www.javaturk.org 96 y w w w .s el so f t.a ca de m staticMethods Paketi www.javaturk.org 97 y ca de m NedenStatikMetot?- I Ø JavaSE8’ekadarstatikmetotlarsadecesınıflarda tanımlanabilirdi. w .s el so f t.a Ø Buyüzden,arayüzlerde ifadeedilensoyutnesne metotlarınayardımcımahiyettekiaraçsal metotlar(utility methods),ancakaraçsal sınıflarda(utility classes)statik olaraktanımlanırdı. Ø Projelerdeaşırımiktardastatikmetodasahipolanaraçsal w w sınıflarçokyaygındır. Ø Butüraraçsalsınıflarınbirliktelikleri(cohesion)düşük, bağımlılıkları(coupling)iseyüksekolmaktadır. www.javaturk.org 98 y ca de m NedenStatikMetot?- II so f t.a Ø Örneğin Ø java.util.Collection arayüzüveCollections araçsal sınıfı. Ø java.nio.file.Path arayüzüvePaths araçsal sınıfı. Ø java.util.Arrays araçsal sınıfı. el Ø Arayüzlerde tanımlanabilenstatikmetotlarlabudurum ortadankalkacaktır. w w w .s Ø Statikmetotlarartıkarayüzlerüzerindebulunabilecektir. Ø Buşekildestatikmetotlarınazsayıdakiaraçsalsınıf üzerindetoplanmasıengellenecekvemoduleryapılar kurgulanabilecektir. www.javaturk.org 99 ca de m y JavaAPIArayüzStatikMetotları w w w .s el so f t.a Ø JavaAPI’sindekistatikmetotlarasahiparayüzlere örnek olarakşunlarverilebilir: Ø java.util.Comparator www.javaturk.org 100 ca de m y Özet Ø Bubölümde,birarayüz (interface)yapısıelealındı. t.a Ø Arayüzlerin yazılımıtasarımındanasılkullanılacağıincelendi. so f Ø Çoktipliyapılarelealındı. w w Ø Varsayılan(default)metotlar Statikmetotlar w .s Ø el Ø JavaSE8ilegelenyeniliklerincelendi. www.selsoft.academy 101 y ca de m t.a w w w .s el so f Ödevler www.selsoft.academy 102 t.a so f el Ø 3.Bölüm uygulamalarında kurguladığınız yandaki hiyerarşiyi, Student bir arayüzolacak şekildedeğiştirin. Ø Budurumda ca de m y Ödevler I w .s AbstractStudent w w isimliyenibir soyutsınıfaihtiyaç duyulacağını gözlemleyin. www.javaturk.org 103 ca de m y Ödevler II w .s el so f t.a Ø Aşağıdasıralanmışfarklıyetkinlikleresahipmühendisleri (engineers)düşünün. Ø Blogger Ø Parent Ø TeamFan Ø InstrumentPlayer Ø JavaEnthusiast w w Ø Butüryetkinliklerefarklıkombinasyonlarlasahipolan nesnelerinasıloluşturacağınızıtartışın. Ø Çözümünüzünsınıfdiyagramınıçizinvekodunuyazın. www.javaturk.org 104