Sopivan sisäkkäisyysstrategian valitseminen
Valitse sisäkkäisten luokkien vaihtoehdoista riippuvuuksien, käyttöoikeuksien ja luettavuuden perusteella.
Sopivan sisäkkäisyysstrategian valitseminen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
Oikean sisäkkäisyysstrategian valinta
Java tarjoaa neljä sisäkkäisyysvaihtoehtoa: ylätason luokan, staattisen sisäkkäisen luokan, sisäluokan (ei-staattisen) sekä paikallisen tai anonyymin luokan. Oikea valinta riippuu kytkeytyneisyydestä, käyttöoikeuksista ja uudelleenkäytön laajuudesta.
Päätöspuu
Esittäkää nämä kysymykset valintaa varten:
- Käytetäänkö luokkaa vain ympäröivän luokan sisällä? → Harkitkaa sisäkkäisyyttä
- Tarvitseeko se ympäröivän luokan instanssia? → Sisäluokka; muuten → Staattinen sisäkkäinen luokka
- Käytetäänkö sitä vain yhdessä metodissa? → Paikallinen tai anonyymi luokka
- Toteuttaako se vain yhden metodin? → Lambda
Ylätason luokka
Käyttäkää ylätason luokkaa, kun tyyppiä käytetään laajasti koodikannassa, se edustaa keskeistä toimialueen käsitettä tai monet muut luokat tuovat sen käyttöö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 importedStaattinen sisäkkäinen luokka
Käyttäkää staattista sisäkkäistä luokkaa, kun luokalla on merkitys vain ympäröivän luokan yhteydessä, se ei tarvitse ympäröivän luokan instanssia ja sen tulee olla käytettävissä ulkopuolelta.
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));
}
}Sisäluokka (ei-staattinen)
Käyttäkää sisäluokkaa, kun luokalla on vahva käsitteellinen yhteys ympäröivän luokan instanssiin ja sen on käytettävä ympäröivän luokan private-jäseniä — esimerkiksi iteraattoreissa tai tiiviisti kytkeytyneissä apuolioissa.
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(); }
}Paikallinen luokka
Käyttäkää paikallista luokkaa, kun luokkaa tarvitaan vain yhdessä metodissa, se on riittävän monimutkainen sisältämään useita metodeja tai tilaa ja haluatte pitää näkyvyysalueen mahdollisimman pienenä.
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)); // 5Anonyymi luokka vai lambda
Käyttäkää anonyymia luokkaa, kun tarvitaan useita metodeja tai abstraktin luokan laajentamista. Käyttäkää lambdaa SAM-rajapinnoille.
// 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 directlyYhteenvetotaulukko
Pikakertaus:
- Ylätason luokka: laaja uudelleenkäyttö, julkisen rajapinnan tyypit
- Staattinen sisäkkäinen luokka: loogisesti ryhmitelty, ympäröivän luokan instanssia ei tarvita
- Sisäluokka: vahvasti sidoksissa ympäröivän luokan instanssiin, tarvitsee private-jäseniä
- Paikallinen luokka: metodin näkyvyysalueella, luokaksi riittävän monimutkainen
- Anonyymi luokka: kertaluonteinen toteutus, lyhytikäinen
- Lambda: SAM-rajapinta, ei tilaa, tiivis
Käytännön harjoitus: HTTP-asiakkaan suunnittelu
Sisäkkäisyysstrategian soveltaminen realistiseen HTTP-asiakkaan suunnitteluun.
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");
}
}Välttäkää liiallista sisäkkäisyyttä
Välttäkää useampaa kuin yhtä sisäkkäisyystasoa. Syvästi sisäkkäisiä luokkia on vaikea hahmottaa ja testata. Siirtäkää luokat ylätason tai pakettinäkyviksi luokiksi, jos ne kasvavat monimutkaisiksi.
Pakettinäkyvä vaihtoehto
Sisäkkäisyyden sijaan voitte määritellä luokan pakettinäkyväksi (ilman näkyvyysmääritettä). Se näkyy vain paketin sisällä, mutta sitä on helpompi testata ja ylläpitää kuin sisäkkäistä luokkaa.
// 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<>();
// ...
}Tietueet ja suljetut rajapinnat vaihtoehtoina
Javan modernit ominaisuudet — tietueet ja suljetut rajapinnat — poistavat usein tarpeen monimutkaisilta sisäkkäisyysratkaisuilta.
// 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();
};
}Pikatarkistus
Milloin ei-staattinen sisäluokka on parempi valinta kuin staattinen sisäkkäinen luokka?
Kertaus: oikean sisäkkäisyysstrategian valinta
Tärkeimmät opit:
- Ylätason luokka: koko koodikannassa laajasti käytetyt julkiset tyypit
- Staattinen sisäkkäinen luokka: loogisesti ryhmitelty ympäröivän luokan kanssa, ympäröivän luokan instanssia ei tarvita
- Sisäluokka: vahvasti sidoksissa ympäröivän luokan instanssiin, käyttää private-jäseniä
- Paikallinen luokka: metodin näkyvyysalueella, riittävän monimutkainen useille metodeille
- Anonyymi luokka: kertaluonteinen, yhdistää määrittelyn ja ilmentämisen
- Lambda: selkein yhden abstraktin metodin rajapinnoille; harkitkaa sitä anonyymeja luokkia korvatessanne
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”Sopivan sisäkkäisyysstrategian valitseminen” ilmainen?
Kyllä – oppitunnin ”Sopivan sisäkkäisyysstrategian valitseminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Sopivan sisäkkäisyysstrategian valitseminen”?
Valitse sisäkkäisten luokkien vaihtoehdoista riippuvuuksien, käyttöoikeuksien ja luettavuuden perusteella. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Sopivan sisäkkäisyysstrategian valitseminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Staattiset sisäkkäiset luokat
- Sisäluokat ja ympäröivän luokan käyttö
- Paikalliset ja anonyymit luokat
- Sopivan sisäkkäisyysstrategian valitseminen