CodeGym /Java Blogu /Rastgele /Arayüzlerdeki varsayılan yöntemler
John Squirrels
Seviye
San Francisco

Arayüzlerdeki varsayılan yöntemler

grupta yayınlandı
Java'nın her yeni sürümü, daha önce gelenlerden farklıdır. Ele aldığımız materyallerdeki değişikliklere bir örnek: Java 5'ten önce dilde enums yoktu. Arayüzlerdeki varsayılan yöntemler - 1Benzer şekilde Java 8, Java 7'den belirgin şekilde farklıdır. Derslerimizin çoğu dilin 7. sürümü için yazılmıştır, ancak elbette önemli yenilikleri de göz ardı etmeyeceğiz. Bu derste zaten arabirimlerden bahsettiğimiz için, bir güncellemeyi ele alacağız — arabirimlerdeki varsayılan yöntemler . Bir arayüzün davranışı uygulamadığını zaten biliyorsunuz . Görevi, onu uygulayan tüm nesnelerin sahip olması gereken davranışı tanımlamaktır.. Ancak geliştiriciler, bir yöntemin uygulamasının tüm sınıflarda aynı olduğu durumlarla sık sık karşılaştı. Eski araba örneğimizi ele alalım:

public interface Car {

   public void gas();

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

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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
"Size göre, bu kodla ilgili temel sorun nedir? Bir sürü tekrarlanan kod yazdığımızı muhtemelen fark etmişsinizdir! Bu sorun programlamada yaygındır ve bundan kaçınmanız gerekir. Başka bir konu, daha önce belirli çözümler yoktu. Java 8 yayınlandı. Bu sürümle birlikte, varsayılan yöntemleri belirleme ve bunları doğrudan arayüzün içinde uygulama yeteneği geldi ! İşte bunu nasıl yapacağınız:

public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Artık tüm arabalar için aynı olan gas()ve brake()yöntemleri arayüze taşındı. Tekrarlanan kod gerekmez. Dahası, yöntemler her sınıfta mevcuttur!

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();
   }
}
Yönteme sahip 100 sınıf varsa gas(), ancak bunların yalnızca 99'u aynı davranışa sahipse ne olur? Bu, her şeyi mahvediyor ve varsayılan yöntemi bu duruma uygun hale getiriyor mu? Tabii ki hayır :) Arayüzlerdeki varsayılan metotlar, sıradan metotlarla aynı şekilde geçersiz kılınabilir.

public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car decelerates differently!");
   }
}
Diğer 99 araba tipinin tümü varsayılan yöntemi uygulayacak veUnusualCarbir istisna olan sınıf, genel resmi bozmaz ve sakince kendi davranışını tanımlar. Arayüzlerin çoklu kalıtımı. Bildiğiniz gibi, Java çoklu kalıtımı desteklemez. Bunun için birçok nedeni vardır. Onlara ayrı bir derste ayrıntılı olarak bakacağız. C++ gibi diğer diller bunu destekler. Çoklu kalıtım olmadan ciddi bir sorun ortaya çıkar: bir nesnenin birkaç farklı özelliği ve 'davranışı' olabilir. İşte hayattan bir örnek: Anne babamız için çocuk, öğretmenlerimiz için öğrenci, doktorlarımız için hastayız. Hayatta farklı roller üstleniriz ve buna bağlı olarak farklı davranırız: Açıkçası, öğretmenlerle yakın arkadaşlarımızla konuştuğumuz gibi konuşmazdık. Bunu koda çevirmeye çalışalım. İki sınıfımız olduğunu düşünün: Gölet ve Kuşhane. Gölet için su tavuğuna ihtiyacımız var; kuşhane için uçan kuşlara ihtiyacımız var. Bunu yapmak için iki temel sınıf oluşturduk:FlyingBirdve Waterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Buna göre, sınıfları miras kalan kuşları FlyingBirdbüyük kuş kafesine, miras alan kuşları da Waterfowlgölete göndereceğiz. Her şey çok basit görünüyor. Ama bir ördeği nereye göndeririz? Yüzer ve uçar. Ve çoklu mirasımız yok. Neyse ki, Java çoklu arabirim uygulamalarını destekler. Bir sınıf birkaç ebeveyni miras alamasa da, birçok arabirimi kolayca uygulayabilir! Ördeğimiz hem uçan bir kuş hem de su kuşu olabilir :) İstenilen sonuca ulaşmak için sınıflardan ziyade arayüzler yapmamız yeterlidir .FlyingBirdWaterfowl

public class Duck implements FlyingBird, Waterfowl {

   // The methods of both interfaces can be easily combined into one class

   @Override
   public void fly() {
       System.out.println("Fly!");
   }

   @Override
   public void swim() {

       System.out.println("Swim!");
   }
}
Buna göre, programımız sınıfların esnekliğini koruyor ve varsayılan yöntemlerle birlikte nesnelerin davranışını tanımlama yeteneğimiz neredeyse sınırsız hale geliyor! :)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION