Bevezetés a javax.measure-ba

1. Áttekintés

Ebben a cikkben bemutatjuk a Mértékegységek API-t - amely biztosítja a Java-ban az intézkedések és egységek képviseletének egységes módja.

Fizikai mennyiségeket tartalmazó programmal dolgozva el kell távolítanunk a használt egységekkel kapcsolatos bizonytalanságot. A számítási hibák elkerülése érdekében elengedhetetlen, hogy a számot és annak egységét is kezeljük.

JSR-363 (korábban JSR-275 vagy javax.intézkedés könyvtár) segít megtakarítani a fejlesztési időt, ugyanakkor olvashatóbbá teszi a kódot.

2. Maven-függőségek

Kezdjük egyszerűen a Maven-függőséggel, hogy behívjuk a könyvtárat:

 javax.measure unit-api 1.0 

A legújabb verzió megtalálható a Maven Central oldalon.

A unit-api A projekt olyan interfészeket tartalmaz, amelyek meghatározzák, hogyan kell a mennyiségekkel és az egységekkel dolgozni. A példákhoz a JSR-363, ami egység-ri:

 tec.units unit-ri 1.0.3 

3. Az API feltárása

Vizsgáljuk meg azt a példát, ahol a vizet egy tartályban szeretnénk tárolni.

A régi megvalósítás így néz ki:

public class WaterTank {public void setWaterQuantity (dupla mennyiség); }

Mint láthatjuk, a fenti kód nem említi a vízmennyiség mértékegységét, és nem alkalmas pontos számításokra a kettős típus.

Ha egy fejlesztő tévesen adja át az értéket egy másik mértékegységgel, mint amire számítunk, az komoly hibákat okozhat a számításokban. Az ilyen hibákat nagyon nehéz felismerni és megoldani.

A JSR-363 Az API biztosítja számunkra a Mennyiség és Mértékegység interfészek, amelyek megoldják ezt a zűrzavart, és az ilyen típusú hibákat kihagyják programunk hatóköréből.

3.1. Egyszerű példa

Most vizsgáljuk meg, és nézzük meg, hogyan lehet ez hasznos a példánkban.

Mint korábban említettük, JSR-363 tartalmazza a Mennyiség interfész, amely mennyiségi tulajdonságot képvisel mint például a térfogat vagy a terület. A könyvtár számos alfelületet kínál, amelyek a leggyakrabban használt számszerűsíthető attribútumokat modellezik. Néhány példa: Hangerő, Hossz, Elektromos töltés, Energia, Hőfok.

Meghatározhatjuk a Mennyiség objektum, amelynek a példánkban tárolt vízmennyiséget kell tárolnia:

public class WaterTank {public void setCapacityMeasure (Quantity capacityMeasure); }

mellett Mennyiség felület, használhatjuk a Mértékegység interfész egy tulajdonság mértékegységének azonosításához. A gyakran használt egységek definíciói megtalálhatók a egység-ri könyvtár, például: KELVIN, MÉTER, NEWTON, CELSIUS.

Típusú objektum Mennyiség rendelkezik módszerekkel az egység és az érték lekérésére: getUnit () és getValue ().

Lássunk egy példát a vízmennyiség értékének beállítására:

@Test public void givenQuantity_whenGetUnitAndConvertValue_thenSuccess () {WaterTank waterTank = new WaterTank (); waterTank.setCapacityMeasure (Quantities.getQuantity (9.2, LITER)); assertEquals (LITER, waterTank.getCapacityMeasure (). getUnit ()); Mennyiség waterCapacity = waterTank.getCapacityMeasure (); dupla térfogatInLitre = waterCapacity.getValue (). doubleValue (); assertEquals (9,2, térfogatLiter, 0,0f); }

Ezt is átalakíthatjuk Hangerő ban ben LITER bármely más egységhez gyorsan:

dupla kötetInMilliLitre = waterCapacity .to (MetricPrefix.MILLI (LITER)). getValue (). doubleValue (); assertEquals (9200,0, kötetInMilliLitre, 0,0f);

De amikor megpróbáljuk átalakítani a vízmennyiséget egy másik egységbe - ami nem típusú Hangerő, fordítási hibát kapunk:

// fordítási hiba waterCapacity.to (MetricPrefix.MILLI (KILOGRAM));

3.2. Osztály paraméterezése

A dimenziókonzisztencia fenntartása érdekében a keret természetesen kihasználja a generikumok előnyeit.

Az osztályokat és az interfészeket mennyiségi típusuk szerint paraméterezik, ami lehetővé teszi egységeink ellenőrzését a fordítás idején. A fordító hibát vagy figyelmeztetést ad az alapján, hogy mit tud azonosítani:

Kilométer egység = MetricPrefix.KILO (MÉTER); Egység centiméter = MetricPrefix.CENTI (LITER); // fordítási hiba

A típusellenőrzés megkerülésére mindig van lehetőség a asType () módszer:

Hüvelyk = CENTI (METER) .x (2.54) .asType (Hossz.osztály);

Helyettesítő karaktert is használhatunk, ha nem vagyunk biztosak a mennyiség típusában:

Unit kelvinPerSec = KELVIN.divide (SECOND);

4. Egységátalakítás

Mértékegységs innen lehet lekérni SystemOfUnits. A specifikáció referencia megvalósítása tartalmazza a Egységek az interfész megvalósítása, amely statikus állandókból áll, amelyek a leggyakrabban használt egységeket képviselik.

Ezen felül létrehozhatunk egy teljesen új egyedi egységet is, vagy létrehozhatunk egy egységet algebrai műveletek alkalmazásával a meglévő egységekre.

A szabványos egység használatának az az előnye, hogy nem ütközünk az átalakítási buktatókba.

Használhatunk előtagokat vagy szorzókat is a MetricPrefix osztály, mint KILO (egység egység) és CENTI (egység egység), amelyek megegyeznek a 10-es hatvány szorzásával és osztásával.

Például meghatározhatjuk a „Kilométert” és a „Centimétert”:

Kilométer egység = MetricPrefix.KILO (MÉTER); Egység centiméter = MetricPrefix.CENTI (MÉTER);

Ezeket akkor lehet használni, ha egy kívánt egység nem érhető el közvetlenül.

4.1. Egyedi egységek

Mindenesetre, ha egység nem létezik az egységek rendszerében, akkor új egységeket hozhatunk létre új szimbólumokkal:

  • AlternateUnit - új egység azonos dimenzióval, de más szimbólummal és jellemmel
  • ProductUnit - egy új egység, amelyet más egységek racionális hatalmának eredményeként hoztak létre

Hozzunk létre néhány egyéni egységet ezen osztályok használatával. Egy példa AlternateUnit nyomáshoz:

@Test public void givenUnit_whenAlternateUnit_ThenGetAlternateUnit () {Unit PASCAL = NEWTON.divide (METRE.pow (2)) .alternate ("Pa"). AsType (Pressure.class); assertTrue (SimpleUnitFormat.getInstance (). elemzés ("Pa") .egyenlőség (PASCAL)); }

Hasonlóképpen, a ProductUnit és átalakítása:

@Test public void givenUnit_whenProduct_ThenGetProductUnit () {Unit squareMetre = METRE.multiply (METER) .asType (Area.class); Mennyiségsor = Quantities.getQuantity (2, METER); assertEquals (line.multiply (line) .getUnit (), squareMetre); }

Itt hoztuk létre a négyzetméter összetett egység szorzással MÉTER önmagával.

Ezután az egységtípusok mellett a keretrendszer a UnitConverter osztály, amely segít átalakítani az egyik egységet a másikba, vagy létrehozni egy új származtatott egységet TransformedUnit.

Lássunk egy példát a kettős érték mértékegységének méterről kilométerre történő fordítására:

@Test public void givenMeters_whenConvertToKilometer_ThenConverted () {double distanceInMeters = 50.0; UnitConverter metreToKilometre = METRE.getConverterTo (MetricPrefix.KILO (METER)); kettős távolságInKilometers = metreToKilometre.convert (distanceInMeters); assertEquals (0,05, távolságInKilometers, 0,00f); }

A mennyiségek egységekkel való egyértelmű elektronikus kommunikációjának megkönnyítése érdekében a könyvtár biztosítja a UnitFormat felület, amely az egész rendszerre kiterjedő címkéket társítja Egységek.

Ellenőrizzük egyes rendszeregységek címkéit a SimpleUnitFormat végrehajtás:

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

5. Műveletek végrehajtása mennyiségekkel

A Mennyiség Az interfész a leggyakoribb matematikai műveletek módszereit tartalmazza: add (), kivonás (), szorozni (), feloszt(). Ezek használatával műveleteket hajthatunk végre Mennyiség tárgyak:

@Test public void givenUnits_WhenAdd_ThenSuccess () {Quantity total = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, METER)); assertEquals (total.getValue (). intValue (), 5); }

A módszerek a Egységek az általuk operált tárgyak közül. Például, ha megpróbálja megszorozni a métereket literekkel, fordítási hibát eredményez:

// összeállítási hiba Quantity total = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, LITER));

Másrészt két objektum adható egységben kifejezve, amelyeknek ugyanaz a dimenziója:

Quantity totalKm = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, MetricPrefix.KILO (METER)); assertEquals (totalKm.getValue (). intValue (), 3002);

Ebben a példában a méter és a kilométer egység is megfelel a Hossz dimenzió, így hozzáadhatók. Az eredményt az első objektum egységében fejezzük ki.

6. Következtetés

Ebben a cikkben ezt láttuk Mérési egységek API kényelmes mérési modellt ad nekünk. És, eltekintve a Mennyiség és Mértékegység, azt is láttuk, hogy mennyire kényelmes átalakítani az egyik egységet a másikba, többféle módon.

További információkért itt bármikor megtekintheti a projektet.

És mint mindig, a teljes kód elérhető a GitHubon.


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