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

challenge icon

Görev

Kolay

Arayü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 bir sendMessage(String message) soyut 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ürerek 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 metot olan Messenger.formatMessage() metodunu kullanın. Ardından bir EmailMessenger ve bir SMSMessenger oluşturun. Her bir mesajlaşma aracı için, formatlanmış mesajla sendWithTimestamp() 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
    }
}
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