Doğru İç İçe Sınıf Stratejisini Seçme
Bağlılık, erişim gereksinimleri ve okunabilirliğe göre iç içe sınıf türleri arasında seçim yapın.
Doğru İç İçe Sınıf Stratejisini Seçme, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Doğru İç İçe Yerleştirme Stratejisini Seçme
Java dört iç içe yerleştirme seçeneği sunar: üst düzey, statik iç içe, iç (statik olmayan) ve yerel/anonim. Doğru seçimi yapmak, bağımlılık düzeyine, erişim gereksinimlerine ve yeniden kullanım kapsamına bağlıdır.
Karar Ağacı
Seçim yapmak için şu soruları sorun:
- Sınıf yalnızca dış sınıfın içinde mi kullanılıyor? → İç içe yerleştirmeyi değerlendirin
- Dış sınıf örneğine ihtiyaç duyuyor mu? → İç sınıf; aksi hâlde → Statik iç içe sınıf
- Yalnızca tek bir yöntemde mi kullanılıyor? → Yerel veya anonim sınıf
- Tek bir yöntemi mi uyguluyor? → Lambda
Üst Düzey Sınıf
Tür, kod tabanının genelinde yaygın olarak kullanılıyorsa, temel bir alan kavramını temsil ediyorsa veya birçok başka sınıf tarafından içe aktarılacaksa üst düzey bir sınıf kullanın.
// Top-level: used across many packages
public class Product {
// ...
}
public interface Repository<T, ID> {
Optional<T> findById(ID id);
void save(T entity);
}
// These belong in separate .java files and are widely importedStatik İç İçe Sınıf
Şu durumlarda statik iç içe sınıf kullanın: sınıf yalnızca dış sınıf bağlamında anlamlıysa, dış sınıf örneğine ihtiyaç duymuyorsa ve dışarıdan erişilebilir olması gerekiyorsa.
class Graph {
// Edge only makes sense in the context of a Graph
public static class Edge {
public final int from, to, weight;
public Edge(int from, int to, int weight) {
this.from = from; this.to = to; this.weight = weight;
}
}
private List<Edge> edges = new ArrayList<>();
public void addEdge(int from, int to, int weight) {
edges.add(new Edge(from, to, weight));
}
}İç (Statik Olmayan) Sınıf
Şu durumlarda iç sınıf kullanın: sınıfın dış sınıf örneğiyle güçlü bir kavramsal bağı varsa ve private üyelere erişmesi gerekiyorsa; Iterator veya birbirine sıkı bağlı yardımcı nesneler buna örnektir.
class DataStore<T> {
private final List<T> data;
DataStore(List<T> data) { this.data = data; }
// Must access data — inner class makes sense
class Snapshot {
private final List<T> copy;
Snapshot() { this.copy = List.copyOf(data); } // accesses outer
T get(int idx) { return copy.get(idx); }
int size() { return copy.size(); }
}
Snapshot snapshot() { return new Snapshot(); }
}Yerel Sınıf
Şu durumlarda yerel sınıf kullanın: sınıfa yalnızca tek bir yöntemde ihtiyaç duyuluyorsa, sınıf birden çok yönteme veya duruma sahip olacak kadar karmaşıksa ve kapsamı en küçük düzeyde tutmak istiyorsanız.
static int countWords(String text, boolean caseSensitive) {
class WordCounter {
Map<String, Integer> counts = new HashMap<>();
void count(String word) {
String key = caseSensitive ? word : word.toLowerCase();
counts.merge(key, 1, Integer::sum);
}
int uniqueCount() { return counts.size(); }
}
WordCounter wc = new WordCounter();
for (String w : text.split("\\s+")) wc.count(w);
return wc.uniqueCount();
}
System.out.println(countWords("the cat sat on the mat", false)); // 5Anonim Sınıf ve Lambda
Birden çok yöntem gerektiğinde veya soyut bir sınıfın genişletilmesi gerektiğinde anonim sınıf kullanın. SAM arayüzleri için lambda kullanın.
// Lambda: clean for SAM
list.sort((a, b) -> a.compareTo(b));
// Anonymous: multi-method, or extending abstract class
java.util.TimerTask task = new java.util.TimerTask() {
@Override public void run() { System.out.println("Tick!"); }
};
// TimerTask is abstract class — can't use lambda directlyÖzet Tablosu
Hızlı başvuru:
- Üst düzey: geniş kapsamlı yeniden kullanım, genel API türleri
- Statik iç içe: mantıksal olarak gruplanmış, dış sınıf örneğine ihtiyaç yok
- İç: dış sınıf örneğine sıkı bağlı, private erişimi gerekiyor
- Yerel: yöntem kapsamlı, bir sınıfı gerektirecek kadar karmaşık
- Anonim: tek kullanımlık uygulama, kısa ömürlü
- Lambda: SAM arayüzü, durum yok, kısa ve öz
Pratik: HTTP İstemcisi Tasarımı
İç içe yerleştirme stratejisinin gerçekçi bir HTTP istemcisi tasarımına uygulanması.
class HttpClient {
// Static nested: request config has no outer reference
public static class RequestConfig {
public final int timeoutMs;
public final String userAgent;
RequestConfig(int timeout, String ua) { this.timeoutMs = timeout; this.userAgent = ua; }
}
// Static nested: response is standalone data carrier
public static class Response {
public final int statusCode;
public final String body;
Response(int code, String body) { this.statusCode = code; this.body = body; }
}
private final RequestConfig config;
HttpClient(RequestConfig config) { this.config = config; }
public Response get(String url) {
// Implementation using this.config
return new Response(200, "body");
}
}Aşırı İç İçe Yerleştirmeden Kaçının
Birden fazla düzeyde iç içe yerleştirme yapmaktan kaçının. Derin biçimde iç içe geçmiş sınıflarda gezinmek ve sınama yapmak zorlaşır. Sınıflar karmaşık hâle gelirse bunları üst düzey veya paket kapsamlı sınıflara ayırın.
Paket Kapsamlı Alternatif
İç içe yerleştirmek yerine bir sınıfı paket kapsamlı yapmayı düşünün (erişim belirteci kullanmayın). Sınıf yalnızca paket içinde görünür olur; ancak iç içe bir sınıfa göre sınanması ve bakımı daha kolaydır.
// In package com.example.order:
// Package-private: visible in package, no nesting
class OrderLine { // no 'public' modifier
final String sku;
final int qty;
OrderLine(String sku, int qty) { this.sku = sku; this.qty = qty; }
}
// Public class in same package can use OrderLine freely
public class Order {
private List<OrderLine> lines = new ArrayList<>();
// ...
}Alternatif Olarak Kayıtlar ve Mühürlü Arayüzler
Modern Java özellikleri olan kayıtlar ve mühürlü arayüzler, çoğu zaman karmaşık iç içe yerleştirme kalıplarına duyulan ihtiyacı ortadan kaldırır.
// Instead of nested inner class hierarchy:
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double b, double h) implements Shape {}
static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.r() * c.r();
case Rectangle r -> r.w() * r.h();
case Triangle t -> 0.5 * t.b() * t.h();
};
}Hızlı Kontrol
İç (statik olmayan) sınıf, statik iç içe sınıfa kıyasla ne zaman en iyi seçimdir?
Özet: Doğru İç İçe Yerleştirme Stratejisini Seçme
Temel çıkarımlar:
- Üst düzey: kod tabanının genelinde yaygın olarak kullanılan genel türler
- Statik iç içe: dış sınıfla mantıksal olarak gruplanmış, dış sınıf örneğine ihtiyaç yok
- İç sınıf: dış sınıf örneğine sıkı bağlı, private üyelere erişiyor
- Yerel sınıf: yöntem kapsamlı, birden çok yöntemi gerektirecek kadar karmaşık
- Anonim sınıf: tek kullanımlık, bildirim ile örnek oluşturmayı birleştiriyor
- Lambda: SAM arayüzleri için en temiz seçenek; anonim sınıfların yerine geçerken değerlendirin
Sıkça Sorulan Sorular
“Doğru İç İçe Sınıf Stratejisini Seçme” dersi ücretsiz mi?
Evet — “Doğru İç İçe Sınıf Stratejisini Seçme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Doğru İç İçe Sınıf Stratejisini Seçme” dersinde ne öğreneceğim?
Bağlılık, erişim gereksinimleri ve okunabilirliğe göre iç içe sınıf türleri arasında seçim yapın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Doğru İç İçe Sınıf Stratejisini Seçme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Statik İç İçe Sınıflar
- İç Sınıflar ve Dış Sınıfa Erişim
- Yerel ve Anonim Sınıflar
- Doğru İç İçe Sınıf Stratejisini Seçme