Arayüzlerde Default ve Static
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 37 / 87.
Başlangıçta arayüzler yalnızca uygulama içermeyen soyut yöntemleri barındırabiliyordu. Java 8 ile birlikte arayüzler varsayılan yöntemleri ve statik yöntemleri içerme özelliği kazandı ve böylece daha esnek hâle geldiler.
Varsayılan bir yöntem, default anahtar sözcüğünü kullanarak doğrudan arayüz içinde bir uygulama sağlar. Arayüzü uygulayan sınıflar bu davranışı otomatik olarak devralır, ancak gerekirse üzerine yazabilir:
public interface Drawable {
void draw();
default void display() {
System.out.println("Displaying on screen...");
draw();
}
}Drawable uygulayan herhangi bir sınıf, display() metoduna ücretsiz olarak sahip olur. Bu, mevcut arayüzlere yeni metotlar eklerken bunları zaten uygulayan sınıfları bozmamak için özellikle kullanışlıdır.
Arayüzlerdeki statik metotlar, sınıflardaki statik metotlar gibi çalışır. Arayüzün kendisine aittirler ve arayüz adı kullanılarak çağrılırlar:
public interface MathOperations {
static int add(int a, int b) {
return a + b;
}
}
// Kullanım
int result = MathOperations.add(5, 3);Statik arayüz yöntemleri geçersiz kılınamaz ve uygulayan sınıflar tarafından miras alınmaz. Arayüzün amacıyla ilgili yardımcı yöntemler için kullanışlıdırlar.
Bir sınıf, aynı varsayılan yöntem imzasına sahip iki arayüzü uygularsa çakışmayı çözmek için bu yöntemi geçersiz kılmalıdır.
Görev
KolayHem arayüzlerdeki varsayılan hem de statik yöntemleri sergileyen bir mesajlaşma sistemi oluşturalım. Uygulayan sınıfların doğrudan kullanabileceği veya ihtiyaç duyduklarında özelleştirebileceği yerleşik işlevlere sahip bir arayüz oluşturacaksınız.
Kodunuzu dört dosyaya ayıracaksınız:
Messenger.java: Herhangi bir mesajlaşma hizmetini temsil eden bir arayüz tanımlayın. void döndüren soyut birsendMessage(String message)yöntemi bildirmelidir.[TIMESTAMP]yazdıran ve ardındansendMessage(message)çağrısını yapansendWithTimestamp(String message)adlı bir varsayılan yöntem ekleyin. Ayrıca, mesajı büyük harfe dönüştürerek döndürenformatMessage(String message)adlı bir statik yöntem ekleyin.EmailMessenger.java:Messengerarayüzünü uygulayan bir sınıf oluşturun. Birrecipientalanı (String) vardır. recipient'ı başlatmak için bir kurucu ekleyin.Email to [recipient]: [message]yazdıracak şekildesendMessage()yöntemini uygulayın. Bu sınıf, varsayılansendWithTimestamp()yöntemini olduğu gibi kullanır.SMSMessenger.java:Messengerarayüzünü uygulayan başka bir sınıf oluşturun. BirphoneNumberalanı (String) vardır. Telefon numarasını başlatmak için bir kurucu ekleyin.SMS to [phoneNumber]: [message]yazdıracak şekildesendMessage()yöntemini uygulayın. Varsayılan zaman damgası davranışını kullanmak yerine[URGENT]yazdırıp ardındansendMessage(message)çağrısı yapacak şekilde varsayılansendWithTimestamp()yöntemini geçersiz kılın.Main.java: Hem varsayılan hem de statik arayüz yöntemlerini göstermek için her şeyi bir araya getirin. Üç girdi alacaksınız: bir e-posta alıcısı, bir telefon numarası ve bir mesaj. Önce mesajı biçimlendirmek için statikMessenger.formatMessage()yöntemini kullanın ve sonucu saklayın. Ardından bir EmailMessenger ve bir SMSMessenger oluşturun. Her mesajlaşma nesnesi için biçimlendirilmiş mesajlasendWithTimestamp()yöntemini çağırın: EmailMessenger'ın varsayılan uygulamayı, SMSMessenger'ın ise geçersiz kılınmış sürümü nasıl kullandığına dikkat edin.
Üç girdi alacaksınız: e-posta alıcısı (String), telefon numarası (String) ve mesaj (String).
Çıktınız toplam dört satır göstermelidir: her mesajlaşma nesnesi için ikişer satır: bir önek satırı ([TIMESTAMP] veya [URGENT]) ve ardından mesaj satırı. EmailMessenger varsayılan zaman damgası önekini, SMSMessenger ise özel acil durum önekini gösterecektir. Her ikisi de statik olarak biçimlendirilmiş (büyük harfli) mesajı kullanacaktır!
Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String emailRecipient = scanner.nextLine();
String phoneNumber = scanner.nextLine();
String message = scanner.nextLine();
// TODO: Mesajı biçimlendirmek ve saklamak için Messenger.formatMessage() kullan
// TODO: E-posta alıcısıyla bir EmailMessenger oluştur
// TODO: Telefon numarasıyla bir SMSMessenger oluştur
// TODO: Biçimlendirilmiş mesajla EmailMessenger üzerinde sendWithTimestamp() çağır
// TODO: Biçimlendirilmiş mesajla SMSMessenger üzerinde sendWithTimestamp() çağır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi