Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
1. Pochopenie stavu objektu:
* Stav definovaný: Stav objektu predstavuje hodnoty uložené vo svojich poliach (premenné inštancie). Tieto hodnoty definujú stav objektu v danom čase.
* Zmeny stavu: Stav sa mení, keď sa metódy nazývajú objekt, ktorý modifikuje hodnoty jeho polí.
* Identita objektu vs. stav: Je rozhodujúce rozlišovať medzi identitou objektu (jeho jedinečnou polohou v pamäti) a jeho stavom (údaje, ktoré obsahuje). Dva objekty môžu mať rovnaký stav, ale stále sú to rôzne objekty.
2. Kľúčové princípy a techniky:
* enkapsulácia (skrytie údajov):
* princíp: Obmedzte priamy prístup k poliam objektu. Vytvorte si polia „súkromné“.
* Účel: Chráni vnútorný stav pred nezamýšľanou úpravou. Umožňuje kontrolovať, ako je prístup k štátu prístupný a menený.
* implementácia: Použite „súkromné“ modifikátory prístupu pre polia. Poskytnite verejné metódy `getter` (Accessor) a` setter` (mutátor) na interakciu so stavom kontrolovaným spôsobom.
* Príklad:
`` `Java
verejná trieda {
Private String názov;
súkromný vek;
verejná osoba (názov struny, int age) {
this.Name =name;
this.age =vek;
}
public String getName () {
návratový názov;
}
public void setName (String name) {
this.Name =name;
}
public int getAge () {
Vek návratnosti;
}
public void setAge (int age) {
if (age> =0) {// validácia
this.age =vek;
} else {
System.out.println („Vek nemôže byť negatívny.“);
}
}
}
`` `
* Ovládaný prístup s Getters and Setters:
* Getters (Accessors): „Verejné“ metódy, ktoré vracajú hodnotu poľa. Poskytujú prístup iba na čítanie do stavu objektu.
* setters (mutátory): „Verejné“ metódy, ktoré umožňujú úpravu hodnoty poľa. Je zásadné, settery by mali obsahovať validáciu a logiku, aby sa zabezpečilo, že stav zostáva konzistentný a platný.
* Imubilita: Ak chcete zabrániť zmenám stavu po vytvorení objektu, neposkytujte setters. Vytvorte objekt so všetkými potrebnými informáciami o stave v konštruktore.
* Validácia:
* Účel: Zabezpečuje, aby stav objektu zostáva v platnom podľa pravidiel vašej žiadosti.
* implementácia: Zahrňte logiku validácie do setters a konštruktorov. Skontrolujte neplatné hodnoty, ako sú záporné veky, prázdne reťazce alebo čísla mimo rozsahu.
* Príklad: (Pozri metódu `SetAGe` v triede` Person` vyššie.)
* Imubilita:
* princíp: Po jeho vytvorení sa nedá zmeniť stav nemenného objektu.
* Výhody:
* Bezpečnosť vlákna: Nepredávajúce objekty sú vo svojej podstate bezpečné, pretože ich stav sa nedá modifikovať súčasne.
* jednoduchosť: Ľahšie uvažuje o a ladení, pretože štát je predvídateľný.
* caching: Môže byť bezpečne ukladané do vyrovnávacej pamäte bez obáv zo zmien.
* implementácia:
* Vytvorte všetky polia `final` a„ súkromné “.
* Neposkytujte žiadnych osadníkov.
* Ak je pole premietateľným objektom (napríklad `List` alebo` map`), vráťte obrannú kópiu v Getter, aby sa zabránilo externej modifikácii.
* Príklad:
`` `Java
public Final Class ImmutablePoint {
súkromné konečné int x;
súkromné finále int y;
verejný nemenný bod (int x, int y) {
this.x =x;
this.y =y;
}
public int getx () {
návrat x;
}
public int gety () {
návrat y;
}
}
`` `
* pozorovateľ (pre závislé objekty):
* Kedy použiť: Ak stav jedného objektu (subjekt) ovplyvňuje stav iných objektov (pozorovateľov).
* Mechanizmus: Subjekt udržiava zoznam pozorovateľov a upozorňuje ich vždy, keď sa jeho stav zmení. Pozorovatelia sa potom podľa toho aktualizujú.
* Príklad: Sledovateľ ceny akcií môže upovedomiť všetkých registrovaných investorov, keď sa zmení cena akcie.
* memento vzor (pre zachovanie štátu):
* Kedy použiť: Ak potrebujete ušetriť a obnoviť stav objektu v rôznych časových bodoch (napr. Pre funkčnosť späť/opakovane).
* Mechanizmus: Objekt vytvára objekt „memento“ obsahujúci snímku jeho súčasného stavu. Memento je možné uložiť a neskôr sa použiť na obnovenie objektu do uloženého stavu.
* stav stavu (pre správanie založené na stave):
* Kedy použiť: Keď sa správanie objektu zmení v závislosti od jeho vnútorného stavu.
* Mechanizmus: Predstavovať každý možný stav ako samostatnú triedu. Kontextový objekt (objekt, ktorého zmeny správania sa mení), obsahuje odkaz na stav stavu. Ak je v kontexte povolaná metóda, deleguje výzvu na objekt súčasného stavu.
* Príklad: Predajný stroj môže mať stavy ako „nečinný“, „výber produktu“, „výdaj“ a „OutOfstock“, každý s rôznym správaním.
* Bezpečnosť vlákna (súbežnosť):
* Dôležitosť: Ak má viac vlákien prístup a úpravu stavu objektu súčasne, musíte zaistiť bezpečnosť vlákna.
* Techniky:
* synchronizácia: Použite „synchronizované“ bloky alebo metódy na ochranu kritických častí kódu, ak je stav upravený.
* Zamknutia: Použite `java.util.concurrent.locks` na viac jemnozrnnej kontroly nad uzamknutím.
* atómové premenné: Použite `java.util.concurrent.atomic` triedy (napr.„ Atomicinteger`, `AtomicBoolean`) na atómové operácie na primitívnych typoch.
* nemenné objekty: Ako už bolo spomenuté, nemenné objekty sú vo svojej podstate bezpečne bezpečné.
* Príklad:
`` `Java
public triedy pult {
súkromný int count =0;
public synchronizované neplatné increment () {
počet ++;
}
public int getCount () {
Počet návratov;
}
}
`` `
* Serializácia:
* Účel: Prevod stavu objektu na prúd bajtov na ukladanie alebo prenos.
* implementácia: Implementujte rozhranie „java.io.serializable“. JVM sa automaticky zaoberá procesom serializácie. Serializáciu si môžete prispôsobiť pomocou kľúčového slova `prechodu (na vylúčenie polí) a implementáciou metód` writeObject () `a` readObject () `.
* Úvahy: Pri aktualizácii definície triedy nezabudnite na kompatibilitu serializovaných objektov.
3. Osvedčené postupy:
* Princíp najmenších privilégií: Poskytnite iba prístup k stavu objektu, ktorý je absolútne nevyhnutný.
* Vymazať pomenovanie: Na uľahčenie pochopenia kódu použite popisné názvy pre polia, getters a setters.
* Dokumentujte váš kód: Vysvetlite účel každej oblasti a očakávané správanie getterov a osadníkov v komentároch Javadoc.
* dôkladne test: Napíšte testy jednotiek, aby ste overili, či je stav objektu správne spravovaný a či sa presadzujú pravidlá validácie.
* Zvážte prípad použitia: Najlepší prístup k riadeniu štátu závisí od konkrétnych požiadaviek vašej aplikácie. Vyberte techniky, ktoré poskytujú správnu rovnováhu flexibility, bezpečnosti a výkonu.
* Vyhýbajte sa verejným poliam: Priame odhalenie polí ako „verejného“ je vo všeobecnosti zlá prax. Obchádza enkapsuláciu a sťažuje kontrolu a udržiavanie štátu.
* Defenzívne kopírovanie: Pri návrate miešaných objektov od Getters zvážte návrat A * Defensive Copy *, aby ste zabránili priamo volajúcemu volajúceho vnútorného stavu objektu. To je obzvlášť dôležité v nemenných triedach.
* Zvážte použitie záznamov (java 14+): Záznamy sú stručným spôsobom, ako vytvoriť nemenné triedy údajov. Automaticky generujú konštruktory, getters, `equals ()`, `hashcode ()` a `toString ()`. Sú vhodné na reprezentáciu objektov prenosu údajov (DTOS) alebo jednoduchých dátových štruktúr.
v súhrne:
Správa stavu objektu v Java je kritickým aspektom objektovo orientovaného dizajnu. Dodržiavaním princípov, ako je zapuzdrenie, nemeniteľnosť, validácia a bezpečnosť vlákien, môžete vytvárať robustné, udržiavateľné a spoľahlivé aplikácie. Konkrétne techniky, ktoré si vyberiete, budú závisieť od zložitosti vašich objektov a požiadaviek vašej aplikácie.