Menu
Coddy logo textTech

Dahili, Yuvalanmış ve Anonim Sınıflar

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 49 / 87.

Java, sınıfları diğer sınıfların içinde tanımlamanıza olanak tanır. Bu iç sınıflar, ilgili işlevleri bir arada gruplayarak kodu düzenlemeye yardımcı olur ve dış sınıfın üyelerine doğrudan erişebilir.

İç içe geçmiş bir iç sınıf, başka bir sınıfın üyesi olarak tanımlanır. Dış sınıfın, özel olanlar da dâhil olmak üzere tüm alanlarına ve yöntemlerine erişebilir:

class Outer {
    private String message = "Hello";
    
    class Inner {
        void display() {
            System.out.println(message);  // Özel (private) alana erişebilir
        }
    }
}

// Kullanım
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();  // Çıktı: Hello

Yerel iç sınıf bir metodun içinde tanımlanır. Yalnızca o metodun içinde kullanılabilir ve etkin olarak final olan yerel değişkenlere erişebilir:

void process() {
    String prefix = "Result: ";
    
    class LocalHelper {
        void print(int value) {
            System.out.println(prefix + value);
        }
    }
    
    new LocalHelper().print(42);
}

Anonim bir iç sınıf, adı olmayan, tek bir ifadede oluşturulup örneği oluşturulan bir sınıftır. Genellikle arayüzleri uygulamak veya sınıfları anında genişletmek için kullanılır:

Comparator<String> comp = new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.length() - b.length();
    }
};

Dahili sınıflar, bir sınıfın yalnızca başka bir sınıfla ilgili olduğu durumlarda özellikle yararlıdır; bu da kodunuzun düzenli ve kapsüllenmiş kalmasını sağlar.

challenge icon

Görev

Kolay

Üç tür iç sınıfın tümünü sergileyen bir alışveriş sepeti sistemi oluşturalım. Öğeleri temsil etmek için iç içe bir sınıf, indirimleri hesaplamak için yerel bir iç sınıf ve son makbuzu biçimlendirmek için anonim bir iç sınıf kullanan bir ShoppingCart oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • ShoppingCart.java: Alışveriş deneyimini yöneten dış sınıfı oluştur. ShoppingCart sınıfında özel bir customerName alanı (String) bulunmalı.

    ShoppingCart içinde, iki özel alana sahip iç içe bir iç sınıf olan Item sınıfını tanımla: name (String) ve price (double). Item sınıfına her iki alanı başlatan bir kurucu ve şu değeri döndüren bir getDetails() yöntemi ekle: [name]: $[price]

    ShoppingCart sınıfının müşteri adını alan bir kurucuya ve bir Item ile indirim yüzdesini (double) kabul eden checkout() adlı bir yönteme ihtiyacı var. checkout() içinde:

    1. DiscountCalculator adlı bir yönteme sahip yerel bir iç sınıf olan applyDiscount(double originalPrice) oluştur. Bu yöntem, indirim yüzdesi uygulandıktan sonraki fiyatı döndürmeli.
    2. Son fiyatı hesaplamak için yerel sınıfı kullan.
    3. Makbuzu biçimlendirmek için Formatter arayüzünü uygulayan (bu arayüzü sen tanımlayacaksın) bir anonim iç sınıf oluştur. Anonim sınıf, birden fazla satırdan oluşan makbuz dizesini döndüren bir format() yöntemini geçersiz kılmalı.

    checkout() yöntemi, biçimlendirilmiş makbuz dizesini tam olarak şu biçimde döndürmeli:

    --- Receipt ---
    Customer: [customerName]
    Item: [item details from getDetails()]
    Discount: [discount]%
    Final Price: $[calculated price]
  • Formatter.java: Tek bir yönteme sahip basit bir arayüz tanımla: String format(). Bu arayüz, checkout yöntemi içindeki anonim iç sınıf tarafından uygulanacak.
  • Main.java: Alışveriş sepetine hayat ver! Üç girdi alacaksın: müşteri adı (String), ürün adı (String) ve ürün fiyatı (double). İndirim yüzdesi 10.0 olarak sabittir.

    Müşteri adıyla bir ShoppingCart oluştur. Ardından dış sınıf başvuru söz dizimini kullanarak bir Item oluştur: cart.new Item(name, price). checkout() yöntemini öğe ve indirimle çağır ve döndürülen makbuzu yazdır.

Üç girdiyi şu sırayla alacaksın: müşteri adı, ürün adı ve ürün fiyatı.

Örneğin girdiler Alice, Laptop ve 1000.0 ise, %10 indirimden sonraki son fiyat 900.0 olur.

Her iç sınıf türünün farklı bir amaca hizmet ettiğine dikkat et: iç içe sınıf, ilgili verileri dış sınıfla gruplandırır; yerel sınıf, yalnızca tek bir yöntem içinde gereken mantığı kapsüller; anonim sınıf ise bir arayüzün hızlı ve tek seferlik bir uygulamasını sağlar!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String customerName = scanner.nextLine();
        String itemName = scanner.nextLine();
        double itemPrice = scanner.nextDouble();
        
        double discount = 10.0;
        
        // TODO: Müşteri adıyla bir ShoppingCart oluşturun
        
        // TODO: cart.new Item(itemName, itemPrice) kullanarak bir Item oluşturun
        
        // TODO: item ve discount ile checkout() metodunu çağırın, ardından sonucu yazdı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

Kendi başına pratik yap: Online Java derleyicisi