Úvod do javax.measure

1. Prehľad

V tomto článku si predstavíme rozhranie Units of Measurement API - ktoré poskytuje jednotný spôsob reprezentácie mier a jednotiek v Jave.

Pri práci s programom obsahujúcim fyzikálne veličiny musíme odstrániť neistotu ohľadom použitých jednotiek. Je nevyhnutné, aby sme spravovali číslo aj jeho jednotku, aby sme predišli chybám vo výpočtoch.

JSR-363 (predtým JSR-275 alebo javax.measure knižnica) nám pomáha šetriť čas na vývoj a zároveň zvyšuje čitateľnosť kódu.

2. Maven závislosti

Jednoducho začnime so závislosťou Maven na vytiahnutie knižnice:

 javax.measure unit-api 1.0 

Najnovšiu verziu nájdete na Maven Central.

The jednotka-api projekt obsahuje množinu rozhraní, ktoré definujú, ako pracovať s veličinami a jednotkami. Pre príklady použijeme referenčnú implementáciu JSR-363, ktorý je jednotka-ri:

 tec.units unit-ri 1.0.3 

3. Skúmanie API

Pozrime sa na príklad, kde chceme skladovať vodu v nádrži.

Staršia implementácia by vyzerala takto:

verejná trieda WaterTank {public void setWaterQuantity (dvojnásobné množstvo); }

Ako vidíme, vyššie uvedený kód nezmieňuje jednotku množstva vody a nie je vhodný na presné výpočty z dôvodu prítomnosti dvojitý typu.

Ak vývojár omylom predá hodnotu s inou mernou jednotkou, ako sme očakávali, môže to viesť k závažným chybám vo výpočtoch. Takéto chyby je veľmi ťažké odhaliť a vyriešiť.

The JSR-363 API nám poskytuje Množstvo a Jednotka rozhrania, ktoré vyriešia tento zmätok a ponechajú tieto druhy chýb mimo rozsahu nášho programu.

3.1. Jednoduchý príklad

Teraz poďme preskúmať a zistiť, ako to môže byť užitočné v našom príklade.

Ako bolo spomenuté predtým, JSR-363 obsahuje the Množstvo rozhranie, ktoré predstavuje kvantitatívnu vlastnosť ako je objem alebo plocha. Knižnica poskytuje množstvo čiastkových rozhraní, ktoré modelujú najbežnejšie používané kvantifikovateľné atribúty. Niektoré príklady: Objem, Dĺžka, Nabíjačka, Energie, Teplota.

Môžeme definovať Množstvo objekt, ktorý by mal skladovať množstvo vody v našom príklade:

verejná trieda WaterTank {public void setCapacityMeasure (Množstvo capacityMeasure); }

Okrem toho Množstvo rozhranie, môžeme tiež použiť Jednotka rozhranie na identifikáciu mernej jednotky pre nehnuteľnosť. Definície často používaných jednotiek nájdete v dokumente jednotka-ri knižnica, ako napríklad: KELVIN, METER, NEWTON, CELSIUS.

Objekt typu Množstvo má metódy na získanie jednotky a hodnoty: getUnit () a getValue ().

Pozrime sa na príklad nastavenia hodnoty množstva vody:

@Test public void givenQuantity_whenGetUnitAndConvertValue_thenSuccess () {WaterTank waterTank = nový WaterTank (); waterTank.setCapacityMeasure (Quantities.getQuantity (9,2, LITER)); assertEquals (LITER, waterTank.getCapacityMeasure (). getUnit ()); Množstvo waterCapacity = waterTank.getCapacityMeasure (); dvojnásobný objemInLitre = waterCapacity.getValue (). doubleValue (); assertEquals (9,2, volumeInLitre, 0,0f); }

Toto môžeme aj previesť Objem v LITER do ktorejkoľvek inej jednotky rýchlo:

dvojnásobný objemInMilliLitre = waterCapacity .to (MetricPrefix.MILLI (LITER)). getValue (). doubleValue (); assertEquals (9200,0, volumeInMilliLitre, 0,0f);

Ale keď sa pokúsime previesť množstvo vody na inú jednotku - ktorá nie je typového typu Objem, dostaneme chybu kompilácie:

// chyba kompilácie waterCapacity.to (MetricPrefix.MILLI (KILOGRAM));

3.2. Parametrizácia triedy

Aby sa zachovala konzistencia dimenzií, rámec prirodzene využíva výhody generík.

Triedy a rozhrania sú parametrizované typom množstva, čo umožňuje kontrolu našich jednotiek v čase kompilácie. Kompilátor vydá chybu alebo varovanie na základe toho, čo dokáže identifikovať:

Kilometer jednotky = MetricPrefix.KILO (METER); Centimeter jednotky = MetricPrefix.CENTI (LITER); // chyba kompilácie

Vždy existuje možnosť obísť kontrolu typu pomocou asType () metóda:

Jednotka palec = CENTI (METER) .krát (2,54) .asType (Length.class);

Ak si nie sme istí typom množstva, môžeme použiť aj zástupný znak:

Jednotka kelvinPerSec = KELVIN.divide (SECOND);

4. Prepočet jednotiek

Jednotkas je možné načítať z SystemOfUnits. Referenčná implementácia špecifikácie obsahuje Jednotky implementácia rozhrania, ktoré poskytuje sadu statických konštánt, ktoré predstavujú najbežnejšie používané jednotky.

Okrem toho môžeme tiež vytvoriť úplne novú vlastnú jednotku alebo jednotku pomocou algebraických operácií na existujúcich jednotkách.

Výhodou použitia štandardnej jednotky je, že nenarážame na nástrahy pri konverzii.

Môžeme tiež použiť predpony alebo multiplikátory z Metrická predpona trieda, ako KILO (jednotka jednotky) a CENTI (jednotka jednotky), ktoré sú ekvivalentné násobeniu a deleniu silou 10.

Napríklad môžeme definovať „Kilometer“ a „Centimeter“ ako:

Kilometer jednotky = MetricPrefix.KILO (METER); Centimeter jednotky = MetricPrefix.CENTI (METER);

Môžu byť použité, keď požadovaná jednotka nie je priamo k dispozícii.

4.1. Vlastné jednotky

V každom prípade, ak jednotka v systéme jednotiek neexistuje, môžeme vytvoriť nové jednotky s novými symbolmi:

  • AlternateUnit - nová jednotka s rovnakým rozmerom, ale odlišným symbolom a prírodou
  • ProductUnit - nová jednotka vytvorená ako produkt racionálnych síl iných jednotiek

Vytvorme pomocou týchto tried niekoľko vlastných jednotiek. Príklad AlternateUnit pre tlak:

@Test public void givenUnit_whenAlternateUnit_ThenGetAlternateUnit () {Unit PASCAL = NEWTON.divide (METRE.pow (2)) .alternate ("Pa"). AsType (Pressure.class); assertTrue (SimpleUnitFormat.getInstance (). parse ("Pa") .equals (PASCAL)); }

Podobne príklad ProductUnit a jeho premena:

@Test public void givenUnit_whenProduct_ThenGetProductUnit () {jednotka squareMetre = METRE.multiply (METER) .asType (Area.class); Riadok množstva = Quantities.getQuantity (2, METER); assertEquals (line.multiply (line) .getUnit (), squareMetre); }

Tu sme vytvorili a squareMetre zložená jednotka vynásobením METER sama so sebou.

Ďalej, k typom jednotiek, rámec tiež poskytuje a UnitConverter triedy, ktorá nám pomáha prevádzať jednu jednotku na druhú, alebo vytvoriť novú odvodenú jednotku s názvom Transformovaná jednotka.

Pozrime sa na príklad otočenia jednotky dvojnásobnej hodnoty z metrov na kilometre:

@Test public void givenMeters_whenConvertToKilometer_ThenConverted () {dvojnásobná vzdialenosťInMeters = 50,0; UnitConverter metreToKilometre = METRE.getConverterTo (MetricPrefix.KILO (METER)); dvojitá vzdialenosťInKilometre = metreToKilometre.convert (distanceInMeters); assertEquals (0,05, distanceInKilometers, 0,00f); }

Na uľahčenie jednoznačnej elektronickej komunikácie veličín s ich jednotkami knižnica poskytuje UnitFormat rozhranie, , ktorá spája celosystémové štítky s Jednotky.

Poďme skontrolovať štítky niektorých systémových jednotiek pomocou SimpleUnitFormat implementácia:

@Test public void givenSymbol_WhenCompareToSystemUnit_ThenSuccess () {assertTrue (SimpleUnitFormat.getInstance (). Parse ("kW") .equals (MetricPrefix.KILO (WATT))); assertTrue (SimpleUnitFormat.getInstance (). parse ("ms") .equals (SECOND.divide (1000))); }

5. Vykonávanie operácií s množstvami

The Množstvo rozhranie obsahuje metódy pre najbežnejšie matematické operácie: pridať (), odčítať (), znásobiť (), rozdeliť (). Pomocou nich môžeme vykonávať operácie medzi Množstvo objekty:

@Test public void givenUnits_WhenAdd_ThenSuccess () {Celkové množstvo = Quantities.getQuantity (2, METER). Add (Quantities.getQuantity (3, METER)); assertEquals (total.getValue (). intValue (), 5); }

Metódy tiež overujú Jednotky objektov, na ktorých operujú. Napríklad pokus o násobenie metrov litrami bude mať za následok chybu kompilácie:

// chyba kompilácie Quantity total = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, LITER));

Na druhej strane je možné pridať dva objekty vyjadrené v jednotkách, ktoré majú rovnakú dimenziu:

Množstvo totalKm = Quantities.getQuantity (2, METER). Add (Quantities.getQuantity (3, MetricPrefix.KILO (METER))); assertEquals (totalKm.getValue (). intValue (), 3002);

V tomto príklade jednotky metra aj kilometre zodpovedajú jednotke Dĺžka aby ich bolo možné pridať. Výsledok je vyjadrený v jednotke prvého objektu.

6. Záver

V tomto článku sme to videli Units of Measurement API poskytuje pohodlný model merania. A okrem použitia Množstvo a Jednotka, videli sme tiež, aké pohodlné je prevádzať jednu jednotku na druhú, a to niekoľkými spôsobmi.

Ďalšie informácie si môžete kedykoľvek pozrieť tu.

Celý kód je ako vždy k dispozícii na GitHub.


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