Abstact sınıfı ve arayüz arasındaki fark
- Java 8'de arabirimlere karşı soyut sınıflar
- Kavramsal Fark:
Java 8'de Arabirim Varsayılan Yöntemleri
- Varsayılan Yöntem nedir?
- ForEach yöntemi derleme hatası Varsayılan Yöntem kullanılarak çözüldü
- Varsayılan Yöntem ve Çoklu Kalıtım Belirsizlik Sorunları
- Java arayüzü varsayılan yöntemleri hakkında önemli noktalar:
Java Arayüzü Statik Yöntemi
- Java Arayüzü Statik Yöntem, kod örneği, statik yöntem vs varsayılan yöntem
- Java arayüzü statik yöntemi hakkında önemli noktalar:
Java İşlevsel Arabirimleri
Java 8'de arabirimlere karşı soyut sınıflar
Java 8 arabirim değişiklikleri, arabirimlerde statik yöntemleri ve varsayılan yöntemleri içerir. Java 8'den önce, arayüzlerde yalnızca yöntem bildirimleri alabilirdik. Ancak Java 8'den, arayüzlerde varsayılan yöntemlere ve statik yöntemlere sahip olabiliriz.
Varsayılan Yöntemi uygulamaya koyduktan sonra arayüzler ve soyut sınıflar aynı görünüyor. Bununla birlikte, Java 8'de hala farklı bir kavramdır.
Soyut sınıf yapıcıyı tanımlayabilir. Daha yapılandırılmıştır ve kendileriyle ilişkili bir duruma sahip olabilirler. Aksine, varsayılan yöntem yalnızca belirli bir uygulamanın durumuna başvurmadan yalnızca diğer arabirim yöntemlerini çağırmak açısından uygulanabilir. Bu nedenle, hem farklı amaçlar için kullanın hem de ikisi arasında seçim yapmak senaryo bağlamına bağlıdır.
Kavramsal Fark:
Soyut sınıflar arayüzlerin iskeletsel (yani kısmi) uygulamaları için geçerlidir, ancak eşleşen bir arayüz olmadan mevcut olmamalıdır.
Yani soyut sınıflar, düşük görünürlük, arayüzlerin iskelet uygulamaları olarak etkili bir şekilde azaltıldığında, varsayılan yöntemler de bunu ortadan kaldırabilir mi? Kesinlikle: Hayır! Arabirimlerin uygulanması neredeyse her zaman varsayılan yöntemlerin eksik olduğu sınıf oluşturma araçlarının bir kısmını veya tamamını gerektirir. Ve eğer bazı arayüzler yapmazsa, açıkça sapıklığa yol açmaması gereken özel bir durumdur.
Java 8'de Arabirim Varsayılan Yöntemleri
Java 8 , geliştiricinin bu Arabirimin mevcut uygulamasını bozmadan Arayüzlere yeni yöntemler eklemesine izin veren “ Varsayılan Yöntem ” veya (Defender yöntemleri) yeni özelliğini sunar. Somut bir Sınıfın bu yöntem için bir uygulama sağlayamadığı durumlarda varsayılan olarak kullanılacak Arayüz tanımlama uygulamasına izin verme esnekliği sağlar.
Nasıl çalıştığını anlamak için küçük bir örnek düşünelim:
public interface OldInterface {
public void existingMethod();
default public void newDefaultMethod() {
System.out.println("New default method"
+ " is added in interface");
}
}
Aşağıdaki Sınıf Java JDK 8'de başarıyla derlenecek,
public class OldInterfaceImpl implements OldInterface {
public void existingMethod() {
// existing implementation is here…
}
}
OldInterfaceImpl örneği oluşturursanız:
OldInterfaceImpl obj = new OldInterfaceImpl ();
// print “New default method add in interface”
obj.newDefaultMethod();
Varsayılan yöntemler hiçbir zaman nihai değildir, senkronize edilemez ve Object'in yöntemlerini geçersiz kılamaz. Her zaman halka açıktır, bu da kısa ve tekrar kullanılabilir yöntemler yazma yeteneğini ciddi şekilde sınırlar.
Varsayılan yöntemler, bir uygulama içerdiğinden, uygulama Sınıflarını etkilemeden bir Arabirime sağlanabilir. Uygulama ile tanımlanan bir Arabirime eklenen her yöntem uygulayıcı Sınıftan etkilenmez. Bir uygulayıcı Sınıf, Arayüz tarafından sağlanan varsayılan uygulamayı geçersiz kılabilir.
Varsayılan yöntemler, bu Arayüzlerin eski uygulamalarını bozmadan mevcut Arayüzlere yeni işlevsellik eklenmesini sağlar.
Varsayılan yöntem içeren bir arabirimi genişlettiğimizde, aşağıdakileri gerçekleştirebiliriz,
- Varsayılan yöntemi geçersiz kılmaz ve varsayılan yöntemi devralır.
- Alt sınıfta geçersiz kıldığımız diğer yöntemlere benzer varsayılan yöntemi geçersiz kıl.
- Varsayılan yöntemi, alt sınıfı geçersiz kılmaya zorlayan soyut olarak yeniden tanımlayın.
ForEach yöntemi derleme hatası Varsayılan Yöntem kullanılarak çözüldü
Java 8 için, JDK koleksiyonları genişletildi ve forEach yöntemi tüm koleksiyona eklendi (lambdalarla birlikte çalışır). Geleneksel yöntemle kod aşağıdaki gibi görünür,
public interface Iterable<T> {
public void forEach(Consumer<? super T> consumer);
}
Bu sonuç derleme hataları ile uygulayan her Sınıf bu nedenle, mevcut uygulamanın değiştirilmemesi için gerekli bir uygulama ile varsayılan bir yöntem eklendi.
Varsayılan yöntemle Yinelenebilir Arabirim aşağıdadır,
public interface Iterable<T> {
public default void forEach(Consumer
<? super T> consumer) {
for (T t : this) {
consumer.accept(t);
}
}
}
Aynı mekanizma, uygulama Sınıflarını bozmadan JDK Arabirimine Akış eklemek için kullanılmıştır .
Varsayılan Yöntem ve Çoklu Kalıtım Belirsizlik Sorunları
Java sınıfı birden çok arabirim uygulayabildiğinden ve her arabirim aynı yöntem imzasıyla varsayılan yöntemi tanımlayabildiğinden, devralınan yöntemler birbiriyle çakışabilir.
Aşağıdaki örneği ele alalım,
public interface InterfaceA {
default void defaultMethod(){
System.out.println("Interface A default method");
}
}
public interface InterfaceB {
default void defaultMethod(){
System.out.println("Interface B default method");
}
}
public class Impl implements InterfaceA, InterfaceB {
}
Yukarıdaki kod aşağıdaki hatayla derlenemez,
java: class Impl, InterfaceA ve InterfaceB türlerinden defaultMethod () için alakasız varsayılanları devralır
Bu sınıfı düzeltmek için varsayılan yöntem uygulamasını sağlamamız gerekir:
public class Impl implements InterfaceA, InterfaceB {
public void defaultMethod(){
}
}
Ayrıca, kendi uygulamamız yerine süper bir arayüz tarafından sağlanan varsayılan uygulamayı çağırmak istiyorsak, bunu aşağıdaki gibi yapabiliriz,
public class Impl implements InterfaceA, InterfaceB {
public void defaultMethod(){
// existing code here..
InterfaceA.super.defaultMethod();
}
}
Yeni yöntemimizin bir parçası olarak herhangi bir varsayılan uygulamayı veya her ikisini birden seçebiliriz.
Java arayüzü varsayılan yöntemleri hakkında önemli noktalar:
- Java arayüzü varsayılan yöntemleri, uygulama sınıflarını kırma korkusu olmadan arayüzleri genişletmemize yardımcı olacaktır.
- Java arabirimi varsayılan yöntemleri, arabirimler ve soyut sınıflar arasındaki farkları kapatmıştır.
- Java 8 arabirimi varsayılan yöntemleri, tüm Collections sınıf yöntemi arabirimlerin kendisinde sağlanabilir gibi yardımcı program sınıflarından kaçınmamıza yardımcı olacaktır.
- Java arabirimi varsayılan yöntemleri, temel uygulama sınıflarını kaldırmamıza yardımcı olacaktır, varsayılan uygulamayı sağlayabiliriz ve uygulama sınıfları hangisini geçersiz kılacağını seçebilir.
- Arabirimlerde varsayılan yöntemleri tanıtmanın başlıca nedenlerinden biri, Java 8'de Koleksiyon API'sını lambda ifadelerini desteklemek için geliştirmektir.
- Hiyerarşideki herhangi bir sınıfın aynı imzalı bir yöntemi varsa, varsayılan yöntemler ilgisiz hale gelir. Varsayılan yöntem java.lang.Object içindeki bir yöntemi geçersiz kılamaz. Akıl yürütme çok basittir, çünkü Object tüm java sınıfları için temel sınıftır. Bu nedenle, arabirimlerde varsayılan yöntemler olarak tanımlanmış Object sınıfı yöntemlerimiz olsa bile, yararsız olacaktır çünkü Object sınıfı yöntemi her zaman kullanılacaktır. Bu nedenle karışıklığı önlemek için, Object sınıfı yöntemlerini geçersiz kılan varsayılan yöntemlere sahip olamayız.
- Java arabirimi varsayılan yöntemlerine Defender Yöntemleri veya Sanal genişletme yöntemleri de denir.
Kaynak Bağlantısı:
- Varsayılan yöntemlerle arabirim - Java 8'de Abstract sınıfı
- JDK 8 döneminde arabirime karşı soyut sınıf
- Sanal genişletme yöntemleri ile arayüz gelişimi
Java Arayüzü Statik Yöntemi
Java Arayüzü Statik Yöntem, kod örneği, statik yöntem vs varsayılan yöntem
Java arabirimi statik yöntemi, uygulama sınıflarında bunları geçersiz kılamamamız dışında varsayılan yönteme benzer. Bu özellik, uygulama sınıflarında yetersiz uygulama durumunda istenmeyen sonuçlardan kaçınmamıza yardımcı olur. Basit bir örnekle buna bakalım.
public interface MyData {
default void print(String str) {
if (!isNull(str))
System.out.println("MyData Print::" + str);
}
static boolean isNull(String str) {
System.out.println("Interface Null Check");
return str == null ? true : "".equals(str) ? true : false;
}
}
Şimdi kötü uygulama ile isNull () yöntemine sahip bir uygulama sınıfı görelim.
public class MyDataImpl implements MyData {
public boolean isNull(String str) {
System.out.println("Impl Null Check");
return str == null ? true : false;
}
public static void main(String args[]){
MyDataImpl obj = new MyDataImpl();
obj.print("");
obj.isNull("abc");
}
}
İsNull (String str) öğesinin basit bir sınıf yöntemi olduğunu, arayüz yöntemini geçersiz kılmadığını unutmayın. Örneğin, isNull () yöntemine @Override ek açıklaması eklersek, derleyici hatasına neden olur.
Şimdi uygulamayı çalıştıracağımız zaman, aşağıdaki çıktıyı alıyoruz.
Arayüz Boş Kontrol
Boş Kontrol Et
Arabirim yöntemini statikten varsayılana yaparsak, aşağıdaki çıktıyı alırız.
Boş Kontrol Et
MyData Yazdır ::
Boş Kontrol Et
Java arabirimi statik yöntemi yalnızca arabirim yöntemleri tarafından görülebilir; isData (MyDataImpl) sınıfından isNull () yöntemini kaldırırsak, MyDataImpl nesnesi için kullanamayız. Ancak, diğer statik yöntemler gibi, sınıf adını kullanarak arabirim statik yöntemlerini kullanabiliriz. Örneğin, geçerli bir ifade şöyle olacaktır:
boolean result = MyData.isNull("abc");
Java arayüzü statik yöntemi hakkında önemli noktalar:
- Java arabirimi statik yöntemi arabirimin bir parçasıdır, uygulama sınıfı nesneleri için kullanamayız.
- Java arabirimi statik yöntemleri, null denetim, koleksiyon sıralama gibi yardımcı yöntem yöntemleri sağlamak için iyidir.
- Java arabirimi statik yöntemi, uygulama sınıflarının bunları geçersiz kılmasına izin vermeyerek güvenlik sağlamamıza yardımcı olur.
- Nesne sınıfı yöntemleri için arabirim statik yöntemini tanımlayamıyoruz, derleyici hatasını “Bu statik yöntem örnek yöntemini Object'ten gizleyemiyor” olarak alacağız. Bunun nedeni, Java'da izin verilmemesidir, çünkü Object tüm sınıflar için temel sınıftır ve bir sınıf düzeyinde statik yönteme ve aynı imzalı başka bir örnek yönteme sahip olamayız.
- Koleksiyonlar gibi yardımcı program sınıflarını kaldırmak ve tüm statik yöntemlerini bulmak ve kullanmak kolay olan ilgili arayüze taşımak için java arayüzü statik yöntemlerini kullanabiliriz.
Java İşlevsel Arabirimleri
Gönderiyi sonuçlandırmadan önce, Fonksiyonel arayüzlere kısa bir giriş yapmak istiyorum. Tam olarak bir soyut yönteme sahip bir arayüz Fonksiyonel Arayüz olarak bilinir.
Bir @FunctionalInterface
arabirimi İşlevsel Arabirim olarak işaretlemek için yeni bir ek açıklama eklendi . @FunctionalInterface
ek açıklama, fonksiyonel arayüzlere soyut yöntemlerin yanlışlıkla eklenmesini önlemek için bir olanaktır. Kullanmak isteğe bağlıdır, ancak iyi bir uygulamadır.
Fonksiyonel arayüzler uzun zamandır beklenen ve Java 8'in çok aranan bir özelliğidir, çünkü onları örneklemek için lambda ifadelerini kullanmamızı sağlar. Lambda ifadeleri ve yöntem referansları için hedef türleri sağlamak üzere bir grup fonksiyonel arayüzlü java.util.function adlı yeni bir paket eklenmiştir. Gelecekteki yazılarda fonksiyonel arayüzlere ve lambda ifadelerine bakacağız.
Kaynak Konumu:
- Java 8 Arayüz Değişiklikleri - statik yöntem, varsayılan yöntem