Állandók a Java-ban: Minták és Anti-Minták

1. Bemutatkozás

Ebben a cikkben megismerjük az állandók Java használatát, különös tekintettel a közös mintákra és az anti-mintákra.

Kezdjük néhány alapvető konvencióval az állandók meghatározásához. Innen a közös anti-mintákra térünk át, mielőtt befejeznénk a közös minták áttekintését.

2. Alapismeretek

Az állandó olyan változó, amelynek értéke nem fog változni, miután meghatároztuk.

Nézzük meg az állandó meghatározásának alapjait:

privát statikus végső int OUR_CONSTANT = 1;

Néhány minta, amelyet megvizsgálunk, a nyilvános vagy magán hozzáférés-módosító döntés. Megállítjuk állandóinkat statikus és végső és adjon nekik megfelelő típust, legyen az Java primitív, osztály vagy an enum. A névnek nagybetűnek kell lennie, a szavakat aláhúzással elválasztva, néha sikító kígyó esetnek is nevezik. Végül megadjuk magát az értéket.

3. Antiminták

Először kezdjük azzal, hogy megtanuljuk, mit ne tegyünk. Nézzünk meg néhány általános anti-mintát, amelyekkel találkozhatunk a Java állandókkal való munka során.

3.1. Varázsszámok

A mágikus számok numerikus literálok egy blokkban:

if (szám == 3.14159265359) {// ...}

Más fejlesztők számára nehéz megérteni őket. Ezenkívül, ha egy számot használunk az egész kódunkban, nehéz megbirkózni az érték megváltoztatásával. Ehelyett a számot konstansként kell meghatároznunk.

3.2. Egy nagy globális konstans osztály

Amikor elindítunk egy projektet, természetes lehet, hogy létrehozunk egy nevű osztályt Állandóak vagy Hasznosságok azzal a szándékkal, hogy meghatározzuk az ott alkalmazott összes állandót. Kisebb projekteknél ez rendben lehet, de vegyünk fontolóra néhány okot, amiért ez nem ideális megoldás.

Először is képzeljük el, hogy száz vagy több konstans van az állandók osztályában. Ha az osztályt nem tartják karban, mind a dokumentációval való lépéstartáshoz, mind az állandók időnként logikai csoportokba történő átdolgozásához, eléggé olvashatatlan lesz. Akár duplikált állandók is lehetnek a végén, kissé eltérő nevekkel. Ez a megközelítés valószínűleg olvashatósági és fenntarthatósági problémákat okoz számunkra a legkisebb projekteken kívül.

Amellett, hogy a logisztika fenntartása Állandóak maga az osztály, más karbantarthatósági problémákat is felkérünk azáltal, hogy túl sok egymásrautaltságot ösztönzünk ezzel az egy globális konstans osztállyal és alkalmazásunk különböző részeivel.

Technikai szempontból a Java fordító a konstans értékét referenciaváltozókba helyezi azokban az osztályokban, amelyekben használjuk őket. Tehát, ha az állandók egyikét megváltoztatjuk az állandók osztályában, és csak azt az osztályt fordítjuk újra, és nem a hivatkozási osztályt, akkor következetlen állandó értékeket kaphatunk.

3.3. A Constant Interface Anti-Pattern

Az állandó interfész-minta az, amikor definiálunk egy interfészt, amely tartalmazza az összes konstansot egy bizonyos funkcionalitáshoz, majd megkapjuk azokat az osztályokat, amelyeknek szüksége van ezekre a funkcionalitásokra az interfész megvalósításához.

Definiáljunk egy állandó interfészt egy számológéphez:

nyilvános felület CalculatorConstants {double PI = 3.14159265359; dupla UPPER_LIMIT = 0x1.fffffffffffffP + 1023; enum {ADD, SUBTRACT, MULTIPLY, DIVIDE} művelet; }

Ezután megvalósítjuk a CalculatorConstants felület:

public class GeometryCalculator megvalósítja a CalculatorConstants {public double operationOnTwoNumbers (double numberOne, double numberTwo, Operation operation) {// Művelet végrehajtásához szükséges kód}}

Az állandó érvelés elleni első érv az, hogy ellentmond a felület céljának. Felületek használatával szerződést szeretnénk létrehozni arra a viselkedésre, amelyet megvalósító osztályaink nyújtani fognak. Amikor konstansokkal teli felületet hozunk létre, nem határozunk meg semmilyen viselkedést.

Másodszor, egy állandó felület használata megnyitja a helyszíni árnyékolás okozta futásidejű problémákat. Vizsgáljuk meg, hogyan történhet ez a FELSŐ HATÁR állandó bennünk GeometryCalculator osztály:

nyilvános statikus végső dupla UPPER_LIMIT = 10000000000000000000000.0.0;

Miután meghatároztuk ezt az állandót a mi GeometryCalculator osztályban elrejtjük az értéket a CalculatorConstants interfész osztályunk számára. Ezután váratlan eredményeket kaphatunk.

Egy másik érv ezen anti-minta ellen az, hogy névtér-szennyezést okoz. A mi CalculatorConstants mostantól bármelyik osztályunk névterében megtalálható lesz, amely megvalósítja a felületet, valamint bármelyik alosztályuk.

4. Minták

Korábban megvizsgáltuk az állandók meghatározásának megfelelő formáját. Nézzünk meg néhány más bevált gyakorlatot az állandókon belüli állandók meghatározásához.

4.1. Általános jó gyakorlatok

Ha az állandók logikailag kapcsolatban vannak egy osztállyal, akkor ott csak definiálhatjuk őket. Ha az állandók halmazát felsorolt ​​típusú tagként tekintjük meg, akkor használhatunk egy enum hogy definiálja őket.

Definiáljunk néhány állandót az a-ban Számológép osztály:

public class Calculator {nyilvános statikus végső dupla PI = 3,14159265359; privát statikus végső dupla UPPER_LIMIT = 0x1.fffffffffffffP + 1023; public enum művelet {ADD, SUBTRACT, DIVIDE, MULTIPLY} public double operationOnTwoNumbers (double numberOne, double numberTwo, Operation operation) {if (numberOne> UPPER_LIMIT) {dobjon új IllegalArgumentException ("'' numberOne 'túl nagy"); } if (numberTwo> UPPER_LIMIT) {dobjon új IllegalArgumentException-t ("" a numberTwo 'túl nagy "); } kettős válasz = 0; kapcsoló (működés) {eset ADD: válasz = számOne + számTwo; szünet; eset ALVONÁS: válasz = számOne - számTwo; szünet; eset DIVIDE: answer = számOne / numberTwo; szünet; eset TÖBB: válasz = számOne * számTwo; szünet; } válasz válasz; }}

Példánkban meghatároztunk egy konstans értéket FELSŐ HATÁR hogy csak a Számológép osztály, ezért beállítottuk magán. Szeretnénk, ha más osztályok is használni tudnák PI és a Művelet enum, tehát ezeket beállítottuk nyilvános.

Vizsgáljuk meg az an használatának néhány előnyét enum mert Művelet. Az első előny, hogy korlátozza a lehetséges értékeket. Képzelje el, hogy a módszerünk egy karakterláncot vesz fel a műveleti értékre azzal a várakozással, hogy a négy állandó karakterlánc közül az egyiket megadják. Könnyen előre láthatunk egy olyan forgatókönyvet, amikor a metódust meghívó fejlesztő elküldi saját karakterlánc-értékét. A ... val enum, az értékek azokra korlátozódnak, amelyeket definiálunk. Azt is láthatjuk, hogy az enumok különösen jól alkalmazhatók kapcsoló nyilatkozatok.

4.2. Állandó osztály

Most, hogy áttekintettünk néhány általános jó gyakorlatot, vegyük figyelembe azt az esetet, amikor egy konstans osztály jó ötlet lehet. Képzeljük el, hogy alkalmazásunk olyan osztályokat tartalmaz, amelyeknek különféle matematikai számításokat kell végrehajtaniuk. Ebben az esetben valószínűleg van értelme meghatározni egy konstans osztályt abban a csomagban az állandók számára, amelyet a számítási osztályainkban használunk.

Hozzunk létre egy MathConstants osztály:

public final class MathConstants {public static final double PI = 3,14159265359; statikus végső dupla GOLDEN_RATIO = 1,6180; statikus végső kettős GRAVITATIONAL_ACCELERATION = 9,8; statikus végső kettős EULERS_NUMBER = 2,7182818284590452353602874713527; public enum művelet {ADD, SUBTRACT, DIVIDE, MULTIPLY} privát MathConstants () {}}

Az első dolog, amit észre kellene vennünk, az az osztályunk az végső hogy ne hosszabbítsák meg. Ezenkívül meghatároztuk a magán konstruktor, így nem lehet példányosítani. Végül láthatjuk, hogy a cikkben korábban tárgyalt többi jó gyakorlatot is alkalmaztuk. Állandó PI van nyilvános mert úgy gondoljuk, hogy a csomagunkon kívül kell hozzáférnünk ahhoz. A többi konstans, aminek hagytuk csomag-privát, így a csomagunkon belül elérhetjük őket. Megalkottuk az összes állandónkat statikus és végső és sikító kígyó ügyben nevezte meg őket. A műveletek egy meghatározott értékkészlet, ezért egy enum hogy meghatározzam őket.

Láthatjuk, hogy a specifikus csomagszintű konstans osztályunk különbözik egy nagy globális konstans osztálytól, mert a csomagunkra lokalizálva van, és az adott csomag osztályainak megfelelő állandókat tartalmaz.

5. Következtetés

Ebben a cikkben megvizsgáltuk a legnépszerűbb minták és anti-minták előnyeit és hátrányait, amikor az állandókat Java-ban használták. Néhány alapvető formázási szabályt indítottunk el, mielőtt az anti-mintákat lefedtük volna. Miután megismertünk néhány általános anti-mintát, megnéztük azokat a mintákat, amelyeket gyakran látunk az állandókra alkalmazni.

Mint mindig, a kód elérhető a GitHubon.