Konštanty v Jave: Vzory a vzory

1. Úvod

V tomto článku sa dozvieme o používaní konštánt v Jave so zameraním na bežné vzory a vzory.

Začneme niekoľkými základnými konvenciami pre definovanie konštánt. Odtiaľ prejdeme k bežným anti-vzorom a potom skončíme s prezeraním bežných vzorov.

2. Základy

Konštanta je premenná, ktorej hodnota sa po definovaní nezmení.

Pozrime sa na základy definovania konštanty:

súkromný statický konečný int OUR_CONSTANT = 1;

Niektoré zo vzorov, na ktoré sa pozrieme, sa budú zaoberať verejné alebo súkromné rozhodnutie o modifikátore prístupu. Vytvárame konštanty statický a konečné a dať im vhodný typ, či už je to primitívum Java, trieda alebo enum. Názov by mal byť tvorený veľkými písmenami so slovami oddelenými podčiarknutiami, niekedy známy ako prípad kričiaceho hada. Na záver uvádzame samotnú hodnotu.

3. Anti-vzory

Najprv sa začnime učiť, čo nerobiť. Pozrime sa na pár bežných anti-vzorov, s ktorými sa môžeme stretnúť pri práci s konštantami Java.

3.1. Čarovné čísla

Magické čísla sú číselné literály v bloku kódu:

if (number == 3,14159265359) {// ...}

Pre ostatných vývojárov je ťažké pochopiť. Ak navyše v našom kóde používame číslo, je ťažké vyrovnať sa so zmenou hodnoty. Mali by sme namiesto toho definovať číslo ako konštantu.

3.2. Veľká trieda globálnych konštánt

Keď začíname projekt, mohlo by byť prirodzené vytvoriť triedu s názvom Konštanty alebo Utility so zámerom definovať všetky konštanty pre tamojšiu aplikáciu. Pre menšie projekty by to mohlo byť v poriadku, zvážme však niekoľko dôvodov, prečo to nie je ideálne riešenie.

Najprv si predstavme, že máme v triede konštánt sto alebo viac konštánt. Ak trieda nebude udržiavaná, bude to dosť nečitateľné, aby bolo možné držať krok s dokumentáciou a občasne refaktorovať konštanty do logických zoskupení. Mohli by sme dokonca skončiť duplicitnými konštantami s mierne odlišnými názvami. Tento prístup nám pravdepodobne prinesie problémy s čitateľnosťou a udržiavateľnosťou v čomkoľvek okrem najmenších projektov.

Okrem logistiky údržby Konštanty samotnej triedy, pozývame aj ďalšie problémy s udržiavateľnosťou podporovaním príliš veľkej vzájomnej závislosti s touto jednou triedou globálnych konštánt a rôznymi ďalšími časťami našej aplikácie.

Po technickejšej stránke kompilátor Java umiestni hodnotu konštanty do odkazovania na premenné v triedach, v ktorých ich používame. Takže ak zmeníme jednu z našich konštánt v našej triede konštánt a iba prekompilujeme túto triedu a nie triedu odkazov, môžeme získať nekonzistentné konštantné hodnoty.

3.3. Konštantné rozhranie Anti-Pattern

Vzor konštantného rozhrania je, keď definujeme rozhranie, ktoré obsahuje všetky konštanty pre určité funkcie, a potom máme triedy, ktoré tieto funkcie na implementáciu rozhrania potrebujú.

Definujme konštantné rozhranie pre kalkulačku:

verejné rozhranie CalculatorConstants {double PI = 3,14159265359; double UPPER_LIMIT = 0x1.fffffffffffffP + 1023; vyčísliť operáciu {PRIDAŤ, ODČÍTAŤ, NÁSOBIŤ, ROZDELIŤ}; }

Ďalej implementujeme naše Konštantná kalkulačka rozhranie:

verejná trieda GeometryCalculator implementuje CalculatorConstants {verejné dvojité operationOnTwoNumbers (dvojité numberOne, dvojité numberTwo, operačné operácie) {// Kód na vykonanie operácie}}

Prvým argumentom proti použitiu konštantného rozhrania je, že ide proti účelu rozhrania. Máme na mysli použitie rozhraní na vytvorenie zmluvy o správaní, ktoré budú poskytovať naše implementačné triedy. Keď vytvárame rozhranie plné konštánt, nedefinujeme žiadne správanie.

Po druhé, používanie konštantného rozhrania nás otvára pred problémami za behu spôsobenými tieňovaním polí. Pozrime sa na to, ako sa to môže stať, definovaním a HORNÁ HRANICA konštantná v rámci našej GeometryCalculator trieda:

verejné statické konečné dvojité UPPER_LIMIT = 100000000000000000000,0;

Akonáhle definujeme túto konštantu v našom GeometryCalculator triedy, skryjeme hodnotu v Konštantná kalkulačka rozhranie pre našu triedu. Potom by sme mohli získať neočakávané výsledky.

Ďalším argumentom proti tomuto anti-vzoru je, že spôsobuje znečistenie menného priestoru. Náš Konštantná kalkulačka budú teraz v priestore názvov ktorejkoľvek z našich tried, ktoré implementujú rozhranie, ako aj všetkých svojich podtried.

4. Vzory

Predtým sme sa pozreli na vhodný formulár na definovanie konštánt. Pozrime sa na niekoľko ďalších osvedčených postupov na definovanie konštánt v rámci našich aplikácií.

4.1. Všeobecné osvedčené postupy

Ak konštanty logicky súvisia s triedou, môžeme ich tam jednoducho definovať. Ak zobrazíme množinu konštánt ako členov vymenovaného typu, môžeme použiť znak enum ich definovať.

Definujme niektoré konštanty v a Kalkulačka trieda:

public class Calculator {public static final double PI = 3.14159265359; súkromné ​​statické konečné dvojité UPPER_LIMIT = 0x1.fffffffffffffP + 1023; public enum Operation {ADD, SUBTRACT, DIVIDE, MULTIPLY} public double operationOnTwoNumbers (double numberOne, double numberTwo, Operation operation) {if (numberOne> UPPER_LIMIT) {throw new IllegalArgumentException ("'numberOne' is too large"); } if (numberTwo> UPPER_LIMIT) {hodiť novú IllegalArgumentException ("" numberTwo "je príliš veľké"); } dvojitá odpoveď = 0; switch (operation) {case ADD: answer = numberOne + numberTwo; prestávka; prípad SUBTRACT: answer = numberOne - numberTwo; prestávka; prípad ROZDELIŤ: answer = numberOne / numberTwo; prestávka; case MULTIPLY: answer = numberOne * numberTwo; prestávka; } spätná odpoveď; }}

V našom príklade sme definovali konštantu pre HORNÁ HRANICA ktoré plánujeme použiť iba v Kalkulačka triedy, tak sme to nastavili na súkromné. Chceme, aby to mohli používať iné triedy PI a Prevádzka enum, tak sme ich nastavili verejné.

Uvažujme o niektorých výhodách používania súboru enum pre Prevádzka. Prvou výhodou je, že obmedzuje možné hodnoty. Predstavte si, že naša metóda vezme reťazec pre operačnú hodnotu s očakávaním, že bude dodaný jeden zo štyroch konštantných reťazcov. Ľahko môžeme predvídať scenár, keď vývojár volajúci metódu pošle svoju vlastnú hodnotu reťazca. Vďaka enum, hodnoty sú obmedzené na tie, ktoré definujeme. Vidíme tiež, že enumy sú zvlášť vhodné na použitie v prepínač Vyhlásenia.

4.2. Triedy konštánt

Teraz, keď sme sa pozreli na niekoľko všeobecných osvedčených postupov, uvažujme o prípade, keď by trieda konštánt mohla byť dobrým nápadom. Poďme si predstaviť, že naša aplikácia obsahuje balík tried, ktoré musia robiť rôzne druhy matematických výpočtov. V tomto prípade má pre nás pravdepodobne zmysel definovať v tomto balíku triedu konštánt pre konštanty, ktoré použijeme v našich výpočtových triedach.

Vytvorme a MathConstants trieda:

public final class MathConstants {public static final double PI = 3.14159265359; statická konečná dvojitá GOLDEN_RATIO = 1,180; statická konečná dvojitá GRAVITATIONAL_ACCELERATION = 9,8; statické konečné dvojité EULERS_NUMBER = 2,7182818284590452353602874713527; public enum Operation {ADD, SUBTRACT, DIVIDE, MULTIPLY} private MathConstants () {}}

Prvá vec, ktorú by sme si mali všimnúť, je naša trieda je konečné aby sa zabránilo jeho rozšíreniu. Ďalej sme definovali a súkromné konštruktora, takže sa nedá vytvoriť inštanciou. Na záver vidíme, že sme použili ďalšie osvedčené postupy, o ktorých sme hovorili vyššie v článku. Naša konštanta PI je verejné pretože predpokladáme, že k nemu budeme musieť pristupovať mimo nášho balíka. Ostatné konštanty, ktoré sme nechali ako balík-súkromné, aby sme k nim mali prístup v rámci nášho balíka. Vytvorili sme všetky svoje konštanty statický a konečné a pomenoval ich v prípade kričiaceho hada. Operácie sú konkrétnou sadou hodnôt, takže sme použili enum ich definovať.

Vidíme, že naša konkrétna trieda konštánt na úrovni balíka sa líši od veľkej triedy globálnych konštánt, pretože je lokalizovaná do nášho balíka a obsahuje konštanty relevantné pre triedy daného balíka.

5. Záver

V tomto článku sme sa zaoberali výhodami a nevýhodami niektorých najobľúbenejších vzorov a vzorov, ktoré sa vyskytujú pri používaní konštánt v jazyku Java. Začali sme s niekoľkými základnými pravidlami formátovania, predtým ako sme sa zaoberali vzormi. Keď sme sa dozvedeli o niekoľkých bežných anti-vzoroch, pozreli sme sa na vzory, ktoré často vidíme aplikované na konštanty.

Ako vždy je kód k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found