Arabirim Bir Sözleşmedir
Bir arabirim, bir sınıfın nasıl yapacağını söylemeden neyi yapabileceğini bildirir. Onu uygulayan herhangi bir sınıfın yerine getirmeyi taahhüt ettiği bir metot imzaları listesidir. Asıl amaç ayrıştırmadır: kod, arabirim türüyle çalışabilir ve arkasında hangi somut sınıfın olduğunu umursamaz.
Circle implements Shape, Circle sınıfının area ve perimeter metotlarını tanımlaması gerektiği anlamına gelir. Bunu yaptığında, bir Circle artık bir Shape'tir ve bir Shape değişkeninde saklanabilir.
Çok Sayıda Sınıf, Tek Bir Tür
Asıl güç, birbiriyle ilgisiz birkaç sınıf aynı arabirimi uyguladığında ortaya çıkar. Shape'e göre yazılmış kod, hepsini işler:
Döngü asla "bu bir Circle mı yoksa Rectangle mı?" diye sormaz - yalnızca area() çağrısı yapar ve sözleşmeye güvenir. Daha sonra bir Triangle eklemek, burada hiçbir değişiklik gerektirmez.
Birden Çok Arabirimi Uygulama
Bir sınıf yalnızca tek bir sınıfı genişletir, ancak istediği kadar arabirimi uygulayabilir - Java davranışın "çoklu kalıtımını" güvenli biçimde böyle gerçekleştirir:
Arabirimleri implements sözcüğünden sonra virgülle ayırarak listeleyin. Sınıfın hepsini karşılaması gerekir.
default ve static Metotlar
Java 8'den beri bir arabirim metot gövdeleri içerebilir. Bir default metot, onu uygulayan sınıflara bedavaya miras aldıkları (ve geçersiz kılabilecekleri) hazır bir uygulama verir:
default metotlar, bir arabirimin gelişmesine olanak tanır - mevcut tüm uygulayıcıları bozmadan bir metot eklemeyi mümkün kılar. Buna karşılık bir static arabirim metodu, Comparator.naturalOrder() gibi doğrudan arabirimin kendisi üzerinden çağırdığınız bir yardımcıdır.
Sabitler
Bir arabirimdeki alanlar örtük olarak public static final'dır - bunlar sabittir, örnek durumu değil:
interface Physics {
double GRAVITY = 9.81; // automatically public static final
}
Arabirimler geleneksel olarak nesne başına durum tutmaz; örnek alanlarının yokluğu, onları sınıflardan ayıran şeyin bir parçasıdır.
İşlevsel Arabirimler
Tam olarak bir soyut metoda sahip bir arabirim işlevsel arabirimdir ve onu bir sınıfın tamamı yerine bir lambda ifadesiyle uygulayabilirsiniz:
Bu, Java'nın lambda ifadelerinin ve java.util.function türlerinin (Function, Predicate, Supplier ve benzerleri) temelidir. @FunctionalInterface ek açıklaması, amacı açık hale getirir ve derleyicinin tek metot kuralını dayatmasını sağlar.
Arabirim ile Soyut Sınıf Karşılaştırması
Her ikisi de bir soyutlamaya göre programlamanıza olanak tanır, peki hangisini ne zaman seçersiniz?
- Arabirim - birbiriyle ilgisiz sınıfların paylaşabileceği bir yetenek. Bir
Birdve birAirplaneikisi deFlyableolabilir. Bir sınıf çok sayıda arabirimi uygulayabilir. Örnek durumu yoktur. - Soyut sınıf - birbiriyle yakından ilişkili sınıflar arasında paylaşılan durum ve kod. Bir
Catve birDogikisi deAnimal'ı genişletir ve ortak alanları ile kısmen uygulanmış metotları miras alır. Bir sınıf yalnızca birini genişletir.
Yaygın bir desen ikisini birleştirir: bir arabirim sözleşmeyi tanımlar ve bir soyut sınıf tekrar eden bölümleri uygular, böylece somut alt sınıflar yalnızca özgün ayrıntıları doldurur.
Sıradaki: Soyut Sınıflar
Arabirimler davranışı durum olmadan tanımlar. Soyut sınıflar arabirimlerle tam sınıflar arasında bir yerde durur - hem uygulanmamış metotları bildirebilir hem de alanları ve yapıcıları taşıyabilirler. Bir sonraki sayfanın konusu budur.
Sıkça Sorulan Sorular
Java'da arabirim (interface) nedir?
Arabirim bir sözleşmedir: bir sınıfın sağlamayı taahhüt ettiği bir dizi metot imzası (ve sabit). Bir sınıfın ne yapabileceğini söyler, nasıl yapacağını değil. Bir sınıf, bir arabirimi benimsemek için implements anahtar sözcüğünü kullanır ve arabirimin bildirdiği her soyut metot için bir gövde sağlamak zorundadır. Arabirimler, birbiriyle ilgisiz sınıfların paylaşılan bir tür üzerinden birbirinin yerine kullanılmasını sağlar.
Java'da arabirim ile soyut sınıf arasındaki fark nedir?
Bir sınıf birçok arabirimi uygulayabilir ancak yalnızca bir (soyut) sınıfı genişletebilir. Arabirimler geleneksel olarak hiçbir örnek durumu tutmaz ve yalnızca davranış bildirir; soyut bir sınıf ise alanlara, yapıcılara ve kısmen uygulanmış mantığa sahip olabilir. Birbiriyle ilgisiz birkaç sınıfın paylaşabileceği bir yeteneği tanımlamak için arabirim kullanın; birbiriyle yakından ilişkili alt sınıflar arasında ortak durum ve kodu paylaşmak için soyut sınıf kullanın.
Bir Java arabiriminin metot gövdeleri olabilir mi?
Evet, Java 8'den beri. default olarak işaretlenmiş arabirim metotları, uygulayan sınıfların miras aldığı (ve geçersiz kılabileceği) bir gövde sağlar; static arabirim metotları ise doğrudan arabirimin kendisi üzerinden çağrılabilen yardımcı davranış sunar. Sıradan arabirim metotları hâlâ soyuttur -yalnızca bir imza- ve uygulayan sınıfların bunları tanımlaması gerekir.