JavaRush /Java Blogu /Random-AZ /İnterfeyslərdə standart üsullar

İnterfeyslərdə standart üsullar

Qrupda dərc edilmişdir
Java-nın hər yeni versiyası əvvəlkilərdən fərqlidir. Budur əhatə etdiyimiz materialdakı dəyişikliklərə bir nümunə: Java 5-dən əvvəl enumdildə heç bir 's yox idi.
İnterfeyslərdə standart üsullar - 1
Eynilə, Java 8 Java 7-dən nəzərəçarpacaq dərəcədə fərqlənir. Bizim mühazirələrimizin əksəriyyəti dilin 7-ci versiyasında yazılır, lakin təbii ki, mühüm yenilikləri də nəzərdən qaçırmayacağıq. Bu mühazirədə interfeyslərdən danışdığımız üçün gəlin bir yeniləməyə baxaq - interfeyslərdə standart üsullar . Siz artıq bilirsiniz ki, interfeys həyata keçirilmir . Onun vəzifəsi onu həyata keçirən bütün obyektlərin hansı davranışa malik olması lazım olduğunu təsvir etməkdir . Ancaq çox vaxt tərtibatçılar bütün siniflərdə bir metodun tətbiqinin eyni olduğu vəziyyətlərlə qarşılaşdılar. Köhnə avtomobil nümunəmizə baxaq:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
Sizcə, bu kodun əsas problemi nədir? Yəqin ki, eyni kodun bir dəstəsini yazdığımızı fərq etdiniz! Bu problem proqramlaşdırmada çox rast gəlinir və ondan qaçınmaq lazımdır. Başqa bir şey odur ki, Java 8-in buraxılmasından əvvəl xüsusi həll variantları yox idi. Bu versiya çıxanda standart metodları müəyyən etmək və onları birbaşa interfeys daxilində həyata keçirmək mümkün oldu! Bunun necə edildiyi belədir:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
gas()İndi bütün maşınlar üçün eyni olan və metodları brake()interfeysə daxil edilib və dublikat kod tələb olunmur. Üstəlik, metodlar dərslərin hər birində mövcuddur!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Bir metodu olan 100 sinif varsa gas(), ancaq onlardan yalnız 99-u eyni davranışa malikdirsə? Bu, hər şeyi məhv edir və bu halda standart üsul işləməyəcək? Əlbəttə ki, yox :) İnterfeyslərin standart üsulları ləğv edilə bilər.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Bütün digər 99 növ maşın standart metodu həyata keçirəcək və sinif UnusualCar- istisna - ümumi mənzərəni korlamayacaq və onun davranışını sakitcə müəyyən edəcəkdir. İnterfeyslərdə çoxlu varislik Bildiyiniz kimi, Java-da çoxlu irsiyyət yoxdur. Bunun bir çox səbəbi var, biz onlara ayrıca mühazirədə ətraflı baxacağıq. Digər dillərdə, məsələn, C++-da bu, əksinədir. Çoxsaylı miras olmadan ciddi problem yaranır: eyni obyekt bir sıra müxtəlif xüsusiyyətlərə və “davranışlara” malik ola bilər. Həyatdan bir misal: valideynlərimiz üçün uşaq, müəllimlər üçün tələbə, həkimlər üçün xəstəyik. Həyatda biz fərqli rollarda görünürük və buna görə də fərqli davranırıq: açıq şəkildə müəllimlərlə yaxın dostlardan fərqli olaraq danışacağıq. Bu vəziyyəti koda çevirməyə çalışaq. Təsəvvür edək ki, iki sinifimiz var: Gölet və Aviary. Bir gölməçə üçün üzən quşlar, quşxana üçün isə uçan quşlar lazımdır. Bunun üçün iki əsas sinif yaratdıq - FlyingBirdWaterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
FlyingBirdMüvafiq olaraq, sinfi miras qalan quşları quşxanaya və gölməçəyə - enənləri göndərəcəyik Waterfowl. Hər şey sadə görünür. Bəs ördəyi haradasa müəyyən etmək lazım gələrsə, nə edəcəyik? O, həm üzür, həm də uçur. Amma bizim çoxlu mirasımız yoxdur. Xoşbəxtlikdən, Java interfeyslərin çoxsaylı tətbiqlərini təmin edir. Bir sinif bir neçə valideyndən miras ala bilmirsə, bir neçə interfeysi həyata keçirmək asandır! Ördəyimiz həm uçur, həm də üzgüçü ola bilir :) İstədiyiniz nəticəni əldə etmək üçün dərslərdən çox FlyingBirdinterfeyslərdən istifadə etmək kifayətdir .Waterfowl
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Bunun sayəsində proqramımız çevik sinif idarəetməsini saxlayır və standart metodların tətbiqi ilə birlikdə obyektlərin davranışını təyin etmək qabiliyyətimiz demək olar ki, sonsuz olur! :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION