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 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.

challenge icon

Görev

Kolay

Hem 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 bir sendMessage(String message) yöntemi bildirmelidir. [TIMESTAMP] yazdıran ve ardından sendMessage(message) çağrısını yapan sendWithTimestamp(String message) adlı bir varsayılan yöntem ekleyin. Ayrıca, mesajı büyük harfe dönüştürerek döndüren formatMessage(String message) adlı bir statik yöntem ekleyin.
  • EmailMessenger.java: Messenger arayüzünü uygulayan bir sınıf oluşturun. Bir recipient alanı (String) vardır. recipient'ı başlatmak için bir kurucu ekleyin. Email to [recipient]: [message] yazdıracak şekilde sendMessage() yöntemini uygulayın. Bu sınıf, varsayılan sendWithTimestamp() yöntemini olduğu gibi kullanır.
  • SMSMessenger.java: Messenger arayüzünü uygulayan başka bir sınıf oluşturun. Bir phoneNumber alanı (String) vardır. Telefon numarasını başlatmak için bir kurucu ekleyin. SMS to [phoneNumber]: [message] yazdıracak şekilde sendMessage() yöntemini uygulayın. Varsayılan zaman damgası davranışını kullanmak yerine [URGENT] yazdırıp ardından sendMessage(message) çağrısı yapacak şekilde varsayılan sendWithTimestamp() 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 statik Messenger.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ş mesajla sendWithTimestamp() 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
    }
}
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

Kendi başına pratik yap: Online Java derleyicisi