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 (interfaces) yalnızca uygulaması olmayan soyut metotlar içerebiliyordu. Java 8'den itibaren arayüzler, varsayılan metotlar (default methods) ve statik metotlar (static methods) içerme yeteneği kazanarak daha esnek hale geldi.
Bir varsayılan metot (default method), default anahtar kelimesini kullanarak doğrudan arayüz (interface) içinde bir uygulama sağlar. Arayüzü uygulayan sınıflar bu davranışı otomatik olarak miras alır ancak gerekirse üzerine yazabilirler (override):
public interface Drawable {
void draw();
default void display() {
System.out.println("Displaying on screen...");
draw();
}
}Drawable arayüzünü uygulayan herhangi bir sınıf, display() metodunu doğrudan kazanır. Bu, halihazırda bu arayüzleri uygulayan sınıfları bozmadan mevcut arayüzlere yeni metodlar eklemek için özellikle yararlı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 metotları geçersiz kılınamaz ve uygulayan sınıflar tarafından miras alınmazlar. Arayüzün amacıyla ilgili yardımcı metotlar için kullanışlıdırlar.
Eğer bir sınıf, aynı varsayılan metot imzasına sahip iki arayüzü implemente ediyorsa, sınıfın bu çakışmayı çözmek için söz konusu metodu override etmesi gerekir.
Görev
KolayArayüzlerdeki (interface) hem varsayılan (default) hem de statik (static) metotları sergileyen bir mesajlaşma sistemi oluşturalım. Uygulayan sınıfların doğrudan kullanabileceği veya gerektiğinde özelleştirebileceği yerleşik işlevlere sahip bir arayüz oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Messenger.java: Herhangi bir mesajlaşma servisini temsil eden bir arayüz tanımlayın. Geriye void döndüren birsendMessage(String message)soyut metodu bildirmelidir.[TIMESTAMP]yazdıran ve ardındansendMessage(message)metodunu çağıransendWithTimestamp(String message)adında bir varsayılan metot (default method) ekleyin. Ayrıca, mesajı büyük harfe dönüştürerek döndürenformatMessage(String message)adında bir statik metot (static method) ekleyin.EmailMessenger.java:Messengerarayüzünü uygulayan bir sınıf oluşturun. Birrecipientalanına (String) sahiptir. Alıcıyı başlatmak için bir yapıcı (constructor) ekleyin.sendMessage()metodunuEmail to [recipient]: [message]yazdıracak şekilde uygulayın. Bu sınıf, varsayılansendWithTimestamp()metodunu olduğu gibi kullanır.SMSMessenger.java:Messengerarayüzünü uygulayan başka bir sınıf oluşturun. BirphoneNumberalanına (String) sahiptir. Telefon numarasını başlatmak için bir yapıcı ekleyin.sendMessage()metodunuSMS to [phoneNumber]: [message]yazdıracak şekilde uygulayın. Varsayılan zaman damgası davranışı yerine[URGENT]yazdırıp ardındansendMessage(message)metodunu çağıracak şekilde varsayılansendWithTimestamp()metodunu geçersiz kılın (override).Main.java: Hem varsayılan hem de statik arayüz metotlarını 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. İlk olarak, mesajı formatlamak ve saklamak için statik metot olanMessenger.formatMessage()metodunu kullanın. Ardından bir EmailMessenger ve bir SMSMessenger oluşturun. Her bir mesajlaşma aracı için, formatlanmış mesajlasendWithTimestamp()metodunu çağırın; EmailMessenger'ın varsayılan uygulamayı nasıl kullandığına, SMSMessenger'ın ise kendi geçersiz kılınmış sürümünü 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, her bir mesajlaşma aracı için ikişer tane olmak üzere toplam dört satır göstermelidir. EmailMessenger varsayılan zaman damgası önekini gösterirken, SMSMessenger kendi özel acil durum önekini gösterecektir. Her ikisi de statik olarak formatlanmış (büyük harf) mesajı kullanacaktır!
Kopya kağıdı
Java 8'den başlayarak, arayüzler soyut metotlara ek olarak varsayılan metotlar (default methods) ve statik metotlar (static methods) içerebilir.
Varsayılan metotlar, default anahtar kelimesini 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 yazabilirler (override):
public interface Drawable {
void draw();
default void display() {
System.out.println("Displaying on screen...");
draw();
}
}Arayüzlerdeki statik metotlar arayüzün kendisine aittir ve arayüz adı kullanılarak çağrılırlar. Üzerine yazılamazlar ve uygulayan sınıflar tarafından devralınmazlar:
public interface MathOperations {
static int add(int a, int b) {
return a + b;
}
}
// Kullanım
int result = MathOperations.add(5, 3);Eğer bir sınıf aynı varsayılan metot imzasına sahip iki arayüzü uygularsa, sınıf çakışmayı gidermek için o metodu geçersiz kılmalıdır (override etmelidir).
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ı formatlamak ve saklamak için Messenger.formatMessage() kullanın
// TODO: E-posta alıcısı ile bir EmailMessenger oluşturun
// TODO: Telefon numarası ile bir SMSMessenger oluşturun
// TODO: Formatlanmış mesaj ile EmailMessenger üzerinde sendWithTimestamp() metodunu çağırın
// TODO: Formatlanmış mesaj ile SMSMessenger üzerinde sendWithTimestamp() metodunu çağırın
}
}
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ı