Menu
Coddy logo textTech

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 uygulaması olmayan soyut metotlar içerebiliyordu. Java 8'den itibaren arayüzler, varsayılan metotlar ve statik metotlar içerme yeteneği kazanarak daha esnek hale geldi.

Bir varsayılan metot (default method), 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 bunu geçersiz kılabilir (override edebilir):

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, mevcut arayüzlere, onları halihazırda uygulayan sınıfları bozmadan 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ınmaz. 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ü uyguluyorsa, çatışmayı çözmek için sınıfın bu metodu geçersiz kılması (override etmesi) gerekir.

challenge icon

Görev

Kolay

Arayüzlerdeki (interfaces) 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 soyut bir sendMessage(String message) metodu bildirmelidir. [TIMESTAMP] yazdıran ve ardından sendMessage(message) metodunu çağıran sendWithTimestamp(String message) adında bir varsayılan metot (default method) ekleyin. Ayrıca, mesajı büyük harfe dönüştürülmüş olarak döndüren formatMessage(String message) adında bir statik metot (static method) ekleyin.
  • EmailMessenger.java: Messenger arayüzünü uygulayan bir sınıf oluşturun. Bir recipient alanına (String) sahiptir. Alıcıyı başlatmak için bir yapıcı (constructor) ekleyin. sendMessage() metodunu Email to [recipient]: [message] yazdıracak şekilde uygulayın. Bu sınıf, varsayılan sendWithTimestamp() metodunu olduğu gibi kullanır.
  • SMSMessenger.java: Messenger arayüzünü uygulayan başka bir sınıf oluşturun. Bir phoneNumber alanına (String) sahiptir. Telefon numarasını başlatmak için bir yapıcı ekleyin. sendMessage() metodunu SMS to [phoneNumber]: [message] yazdıracak şekilde uygulayın. Varsayılan zaman damgası davranışı yerine [URGENT] yazdırıp ardından sendMessage(message) metodunu çağıracak şekilde varsayılan sendWithTimestamp() 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 Messenger.formatMessage() metodunu kullanın. Ardından bir EmailMessenger ve bir SMSMessenger oluşturun. Her bir haberci için, formatlanmış mesajla sendWithTimestamp() metodunu çağırın; EmailMessenger'ın varsayılan uygulamayı nasıl kullandığına, SMSMessenger'ın ise 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 haberci için ikişer tane olmak üzere toplam dört satır göstermelidir: bir önek satırı ([TIMESTAMP] veya [URGENT]) ve ardından mesaj satırı. 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!

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: EmailMessenger üzerinde formatlanmış mesaj ile sendWithTimestamp() metodunu çağırın
        
        // TODO: SMSMessenger üzerinde formatlanmış mesaj ile sendWithTimestamp() metodunu çağırın
    }
}
quiz iconKendini test et

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