Μια ένθετη κλάση είναι μια κλάση που ορίζεται μέσα σε μια άλλη κλάση. Η Java έχει τέσσερα είδη — στατική ένθετη, εσωτερική (μη στατική), τοπική και ανώνυμη — καθένα με διαφορετική πρόσβαση στην εγκλειστική κλάση και διαφορετικές περιπτώσεις χρήσης.
Μια ένθετη κλάση είναι μια κλάση που ορίζεται μέσα σε μια άλλη κλάση. Η Java έχει τέσσερα είδη — στατική ένθετη, εσωτερική (μη στατική), τοπική και ανώνυμη — καθένα με διαφορετική πρόσβαση στην εγκλειστική κλάση και διαφορετικές περιπτώσεις χρήσης.
public class Outer {
private static int data = 10;
static class Nested { // static → no reference to an Outer INSTANCE
void show() {
System.out.println(data); // can access static members of Outer only
}
}
}
Outer.Nested n = new Outer.Nested(); // created without an Outer instance
Μια static ένθετη κλάση συμπεριφέρεται όπως μια κλάση ανώτατου επιπέδου αλλά είναι χωρική μέσα στην εξωτερική. Δεν διατηρεί αναφορά σε ένα εξωτερικό παράδειγμα — χρησιμοποιείται για την ομαδοποίηση βοηθών (π.χ. ένα Builder, Node σε μια δομή δεδομένων).
public class Outer {
private int value = 5;
class Inner { // non-static → has an implicit reference to Outer
void show() {
System.out.println(value); // can access Outer's INSTANCE members (even private)
}
}
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // needs an Outer instance to create
Μια μη στατική εσωτερική κλάση διατηρεί μια έμμεση αναφορά στο στιγμιότυπό της, οπότε μπορεί να αποκτήσει πρόσβαση στα πεδία παράδειγμα του εξωτερικού αντικειμένου. (Προσοχή: αυτή η αναφορά μπορεί να προκαλέσει διαρροές μνήμης εάν το εσωτερικό παράδειγμα ζει περισσότερο από το εξωτερικό.)
void process() {
class Helper { // local to this method
void run() { ... }
}
new Helper().run();
}
Σπάνια χρησιμοποιείται. περιορίστηκε στη μέθοδο.
// implement an interface/abstract class inline, for single use
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { handleClick(); }
});
Runnable task = new Runnable() {
public void run() { System.out.println("running"); }
};
Μια ανώνυμη κλάση είναι μια εφάπαξ υλοποίηση ενός περιβάλλοντος ή κλάσης, που ορίστηκε και αντικαταστάθηκε ταυτόχρονα — ιστορικά κοινή για επεξεργαστές συμβάντων και επανακλήσεις. Σύγχρονη Java συχνά αντικαθιστά αυτές με lambdas όταν ο στόχος είναι ένα λειτουργικό περιβάλλον:
button.addActionListener(e -> handleClick()); // ✅ lambda — much cleaner
Runnable task = () -> System.out.println("running");
Οι ένθετες κλάσεις είναι ένα χρήσιμο εργαλείο για τη λογική ομαδοποίηση κλάσεων που χρησιμοποιούνται μόνο σε ένα περιβάλλον, αυξάνοντας την ενκάψυλωση και την αναγνωσιμότητα.
Η κατανόηση των ειδών — ιδιαίτερα η διάκριση static-versus-inner (static = ανεξάρτητη, inner = διατηρεί μια αναφορά εγκλειστικού-παραδείγματος) — έχει σημασία για το σχεδιασμό και την αποφυγή σφαλμάτων: η έμμεση εξωτερική αναφορά των εσωτερικών κλάσεων μπορεί να προκαλέσει διαρροές μνήμης, και η επιλογή static όταν δεν χρειάζεστε το εξωτερικό παράδειγμα είναι η καθαρότερη προεπιλογή.
Οι ανώνυμες κλάσεις ήταν ο κλασικός τρόπος να παρέχουν εσωτερικές υλοποιήσεις (επεξεργαστές συμβάντων, συγκριτές), και η γνώση ότι αντικαθίστανται μεγάλως από lambdas για λειτουργικά περιβάλλοντα αντανακλά σύγχρονη Java εμπειρία.
Αυτές εμφανίζονται σε ολόκληρη τη βιβλιοθήκη προτύπου (π.χ. Map.Entry είναι μια ένθετη διεπαφή, οι κατασκευαστές είναι στατικές ένθετες κλάσεις), καθιστώντας τες πρακτικές, συχνά συναντημένες γνώσεις.