Programovanie

Dizajn so statickými členmi

Aj keď je Java do značnej miery objektovo orientovaná, nejde o čistý objektovo orientovaný jazyk. Jedným z dôvodov, prečo Java nie je čisto objektovo orientovaná, je to, že nie všetko v nej je objekt. Napríklad Java vám umožňuje deklarovať premenné primitívnych typov (int, plavák, booleanatď.), ktoré nie sú objektmi. A Java má statické polia a metódy, ktoré sú nezávislé a oddelené od objektov. Tento článok poskytuje rady, ako používať statické polia a metódy v programe Java, pričom sa pri vašich návrhoch zachováva objektovo zamerané zameranie.

Životnosť triedy vo virtuálnom stroji Java (JVM) má veľa podobností so životnosťou objektu. Rovnako ako môže mať objekt stav vyjadrený hodnotami jeho inštančných premenných, trieda môže mať stav predstavovaný hodnotami jeho premenných triedy. Rovnako ako JVM pred vykonaním inicializačného kódu nastaví inštančné premenné na predvolené počiatočné hodnoty, pred vykonaním inicializačného kódu nastaví JVM premenné triedy na predvolené počiatočné hodnoty. A rovnako ako objekty, aj triedy môžu byť zbavené odpadu, ak na ne už bežiaca aplikácia neodkazuje.

Napriek tomu existujú významné rozdiely medzi triedami a objektmi. Asi najdôležitejším rozdielom je spôsob, akým sa vyvolávajú inštančné a triedne metódy: inštančné metódy sú (z väčšej časti) dynamicky viazané, ale triedne metódy sú viazané staticky. (V troch špeciálnych prípadoch nie sú inštančné metódy dynamicky viazané: vyvolanie metód súkromnej inštancie, vyvolanie init metódy (konštruktory) a vyvolanie pomocou Super kľúčové slovo. Ďalšie informácie nájdete v zdrojoch.)

Ďalším rozdielom medzi triedami a objektmi je stupeň skrývania údajov poskytovaný úrovňami súkromného prístupu. Ak je premenná inštancie vyhlásená za súkromnú, majú k nej prístup iba metódy inštancie. To vám umožní zabezpečiť integritu údajov inštancie a zaistiť bezpečnosť vlákien objektov. Zvyšok programu nemôže priamo pristupovať k týmto inštančným premenným, ale musí manipulovať s inštančnými metódami, aby manipuloval s premennými inštancie. V snahe dosiahnuť, aby sa trieda chovala ako dobre navrhnutý objekt, môžete premenné triedy nastaviť ako súkromné ​​a definovať metódy triedy, ktoré s nimi manipulujú. Týmto spôsobom však nezískate tak dobrú záruku bezpečnosti vlákien alebo dokonca integrity údajov, pretože určitý druh kódu má špeciálne privilégium, ktoré im umožňuje priamy prístup k premenným súkromnej triedy: inštančným metódam a dokonca aj inicializátorom inštancie. premenné, môžu priamo pristupovať k týmto premenným súkromnej triedy.

Takže statické polia a metódy tried, aj keď sú mnohými spôsobmi podobné inštančným poliam a metódam objektov, majú významné rozdiely, ktoré by mali mať vplyv na spôsob ich použitia v dizajnoch.

Zaobchádzanie s triedami ako s objektmi

Pri navrhovaní programov Java sa pravdepodobne stretnete s mnohými situáciami, v ktorých cítite potrebu objektu, ktorý funguje ako trieda. Môžete napríklad chcieť objekt, ktorého životnosť sa zhoduje s životnosťou triedy. Alebo môžete chcieť objekt, ktorý sa rovnako ako trieda obmedzuje na jeden objekt inštancia v danom priestore mien.

V dizajnových situáciách, ako sú tieto, môže byť lákavé vytvoriť triedu a použiť ju ako objekt na definovanie premenných triedy, ich nastavenie ako súkromné ​​a definovanie niektorých verejných metód triedy, ktoré manipulujú s premennými triedy. Rovnako ako objekt, aj takáto trieda má stav. Rovnako ako dobre navrhnutý objekt, aj premenné, ktoré definujú stav, sú súkromné ​​a vonkajší svet môže tento stav ovplyvniť iba vyvolaním metód triedy.

Bohužiaľ, s týmto prístupom „triedy ako objekt“ existujú určité problémy. Pretože triedne metódy sú staticky viazané, vaša trieda ako objekt nebude využívať výhody flexibility polymorfizmu a upcastingu. (Definície polymorfizmu a dynamickej väzby nájdete v článku Dizajnové techniky, Zloženie verzus dedičnosť.) Polymorfizmus je umožnený a upcasting užitočný pomocou dynamickej väzby, ale metódy triedy nie sú dynamicky viazané. Ak niekto podtriedi vašu triedu ako objekt, nebude schopný prepísať svoje metódy triedy vyhlásením metód triedy s rovnakým názvom; budú môcť iba skryť ich. Keď je vyvolaná jedna z týchto predefinovaných metód triedy, JVM vyberie implementáciu metódy tak, aby sa nespúšťala pomocou triedy objektu za behu, ale podľa typu premennej v čase kompilácie.

Bezpečnosť vlákien a integrita údajov dosiahnutá dôkladnou implementáciou metód triedy vo vašej triede ako objekt sú navyše ako dom postavený zo slamy. Vaša bezpečnosť vlákien a integrita údajov budú zaručené, pokiaľ bude každý používať metódy triedy na manipuláciu so stavom uloženým v premenných triedy. Ale neopatrný alebo bezradný programátor by mohol, s pridaním jednej inštančnej metódy, ktorá pristupuje priamo k vašim premenným súkromnej triedy, neúmyselne nafúknuť a nafúknuť a vyhodiť vaše zabezpečenie vlákna a integritu dát preč.

Z tohto dôvodu je moje hlavné usmernenie týkajúce sa premenných triedy a metód triedy:

Nesprávajte sa s triedami ako s objektmi.

Inými slovami, nevytvárajte dizajn so statickými poľami a metódami triedy, akoby to boli inštančné polia a metódy objektu.

Ak chcete stav a správanie, ktorých životnosť sa zhoduje s životnosťou triedy, vyhnite sa simuláciám objektu pomocou premenných triedy a metód triedy. Namiesto toho vytvorte skutočný objekt a pomocou premennej triedy podržte odkaz na ňu a metódy triedy poskytnite prístup k odkazu na objekt. Ak sa chcete ubezpečiť, že v jednom priestore mien existuje iba jedna inštancia určitého stavu a správania, neskúšajte navrhnúť triedu, ktorá simuluje objekt. Namiesto toho vytvorte a singleton - objekt, ktorý má zaručene iba jednu inštanciu na jeden menný priestor.

Na čo sú teda členovia triedy dobré?

Podľa môjho názoru je najlepšie sa pri navrhovaní programov Java kultivovať pri myslení objektov, objektov, objektov. Zamerajte sa na navrhovanie skvelých objektov a triedy považujte predovšetkým za plány objektov - štruktúru, v ktorej definujete inštančné premenné a inštančné metódy, ktoré tvoria vaše dobre navrhnuté objekty. Okrem toho si môžete myslieť, že triedy poskytujú niekoľko špeciálnych služieb, ktoré objekty nemôžu poskytnúť alebo ktoré nemôžu poskytnúť tak elegantne. Predstavte si triedy ako:

  • správne miesto na definovanie „úžitkových metód“ (metód, ktoré prijímajú vstup a poskytujú výstup iba prostredníctvom odovzdaných parametrov a návratovej hodnoty)
  • spôsob riadenia prístupu k objektom a údajom

Úžitkové metódy

Metódy, ktoré nemanipulujú alebo nevyužívajú stav objektu alebo triedy, nazývam „úžitkové metódy“. Metódy obslužného programu iba vrátia určitú hodnotu (alebo hodnoty) vypočítanú iba z údajov odovzdaných metóde ako parametre. Takéto metódy by ste mali staticky umiestniť a umiestniť do triedy, ktorá najviac súvisí so službou, ktorú metóda poskytuje.

Príkladom úžitkovej metódy je Reťazec copyValueOf (char [] dáta) metóda triedy String. Táto metóda vytvára jeho výstup, návratovú hodnotu typu String, výlučne z jeho vstupného parametra, pole chars. Pretože copyValueOf () nepoužíva ani neovplyvňuje stav žiadneho objektu alebo triedy, je to užitočná metóda. Rovnako ako všetky užitočné metódy by mali byť, copyValueOf () je triedna metóda.

Jedným z hlavných spôsobov použitia metód triedy sú teda úžitkové metódy - metódy, ktoré vracajú výstup vypočítaný iba zo vstupných parametrov. Iné použitie metód triedy zahrnuje premenné triedy.

Premenné triedy na skrytie údajov

Jedným zo základných príkazov v objektovo orientovanom programovaní je skrývanie údajov - obmedzenie prístupu k údajom na minimalizáciu závislostí medzi časťami programu. Ak má konkrétny údaj obmedzenú dostupnosť, tieto údaje sa môžu zmeniť bez toho, aby došlo k narušeniu tých častí programu, ktoré k nim nemajú prístup.

Ak je napríklad objekt potrebný iba v inštanciách konkrétnej triedy, odkaz na neho je možné uložiť do premennej súkromnej triedy. Vďaka tomu majú všetky inštancie tejto triedy ľahký prístup k danému objektu - inštancie ich jednoducho používajú priamo -, ale žiadny iný kód kdekoľvek inde v programe sa k nim nemôže dostať. Podobným spôsobom môžete použiť prístup k balíkom a premenné chránenej triedy na zníženie viditeľnosti objektov, ktoré musia zdieľať všetci členovia balíka a podtried.

Premenné verejnej triedy sú iný príbeh. Ak premenná verejnej triedy nie je konečná, je to globálna premenná: ten odporný konštrukt, ktorý je protikladom skrývania údajov. Pre premennú verejnej triedy nikdy neexistuje ospravedlnenie, pokiaľ nie je konečné.

Konečné premenné verejnej triedy, či už ide o primitívny typ alebo objekt, slúžia užitočnému účelu. Premenné primitívnych typov alebo typu String sú jednoducho konštanty, ktoré vo všeobecnosti pomáhajú zvyšovať flexibilitu programov (ľahšie sa menia). Kód, ktorý používa konštanty, sa dá ľahšie zmeniť, pretože konštantnú hodnotu môžete zmeniť na jednom mieste. Verejné konečné premenné triedy referenčných typov vám umožňujú poskytnúť globálny prístup k objektom, ktoré sú globálne potrebné. Napríklad, System.in, System.outa System.err sú verejné premenné poslednej triedy, ktoré poskytujú globálny prístup k štandardnému vstupnému výstupu a chybovým prúdom.

Hlavným spôsobom, ako zobraziť premenné triedy, je teda mechanizmus na obmedzenie prístupnosti (to znamená, skryť) premenných alebo objektov. Keď skombinujete metódy triedy s premennými triedy, môžete implementovať ešte komplikovanejšie politiky prístupu.

Používanie metód triedy s premennými triedy

Okrem toho, že fungujú ako úžitkové metódy, je možné pomocou metód triedy riadiť prístup k objektom uloženým v premenných triedy - najmä riadiť spôsob vytvárania alebo správy objektov. Dva príklady tohto druhu triednej metódy sú: setSecurityManager () a getSecurityManager () metódy vyučovania Systém. Správca zabezpečenia pre aplikáciu je objekt, ktorý je rovnako ako štandardné vstupné, výstupné a chybové toky potrebné na mnohých rôznych miestach. Na rozdiel od štandardných objektov toku I / O však odkaz na správcu bezpečnosti nie je uložený vo verejnej premennej poslednej triedy. Objekt správcu bezpečnosti je uložený v premennej súkromnej triedy a metódy set and get implementujú pre objekt špeciálnu politiku prístupu.

Bezpečnostný model Java kladie na manažéra bezpečnosti špeciálne obmedzenie. Pred jazykom Java 2 (predtým známym ako JDK 1.2) začala aplikácia svoj život bez správcu zabezpečenia (getSecurityManager () vrátený nulový). Prvá výzva na číslo setSecurityManager () zriadil bezpečnostného manažéra, ktorý sa potom nesmel meniť. Akékoľvek ďalšie volania na číslo setSecurityManager () by prinieslo bezpečnostnú výnimku. V prostredí Java 2 začína aplikácia vždy správcom zabezpečenia, ale podobne ako v predchádzajúcich verziách, setSecurityManager () metóda vám umožní zmeniť maximálne jedenkrát bezpečnostný manažér.

Správca zabezpečenia poskytuje dobrý príklad toho, ako je možné použiť metódy triedy v spojení s premennými súkromnej triedy na implementáciu špeciálnej politiky prístupu pre objekty, na ktoré odkazujú premenné triedy. Okrem úžitkových metód uvažujte o metódach triedy ako o prostriedkoch na vytvorenie špeciálnych prístupových politík pre odkazy na objekty a údaje uložené v premenných triedy.

Usmernenia

Hlavné odporúčanie uvedené v tomto článku je:

Nesprávajte sa s triedami ako s objektmi.

Ak potrebujete nejaký predmet, urobte si ho. Svoje použitie premenných a metód triedy obmedzte na definovanie metód obslužných programov a implementáciu špeciálnych druhov prístupových politík pre objekty a primitívne typy uložené v premenných tried. Aj keď nejde o čistý objektovo orientovaný jazyk, Java je vo veľkej miere objektovo orientovaná a vaše návrhy by to mali odrážať. Mysli na predmety.

Ďalší mesiac

Budúci mesiac Dizajnové techniky článok bude posledný v tomto stĺpci. Čoskoro začnem písať knihu založenú na materiáli Design Techniques, Flexibilná Java, a tento materiál postupne umiestni na moju webovú stránku. Sledujte teda tento projekt a pošlite mi spätnú väzbu. Po prestávke mesiac alebo dva som späť na JavaWorld a SunWorld s novou rubrikou zameranou na Jiniho.

Žiadosť o účasť čitateľov

Odporúčam vaše pripomienky, kritiky, návrhy, plamene - všetky druhy spätnej väzby - k materiálom uvedeným v tomto stĺpci. Ak s niečím nesúhlasíte alebo máte čo dodať, dajte nám vedieť.

Môžete sa zúčastniť diskusného fóra venovaného tomuto materiálu, vložiť komentár prostredníctvom formulára v dolnej časti článku alebo mi priamo poslať e-mail pomocou odkazu uvedeného v mojom životopise nižšie.

Bill Venners píše softvér profesionálne už 12 rokov. So sídlom v Silicon Valley poskytuje softvérové ​​poradenstvo a školiace služby pod menom Artima Software Company. V priebehu rokov vyvíjal softvér pre spotrebnú elektroniku, vzdelávanie, polovodiče a životné poistenie. Programoval v mnohých jazykoch na mnohých platformách: montážny jazyk na rôznych mikroprocesoroch, C na Unixe, C ++ na Windows, Java na webe. Je autorom knihy Inside the Java Virtual Machine, ktorú vydalo vydavateľstvo McGraw-Hill.
$config[zx-auto] not found$config[zx-overlay] not found