Uvod u javax.measure

1. Pregled

U ovom ćemo članku predstaviti Jedinice mjerenja - koji pruža jedinstveni način predstavljanja mjera i jedinica na Javi.

Tijekom rada s programom koji sadrži fizičke veličine, moramo ukloniti nesigurnost oko korištenih jedinica. Bitno je da upravljamo brojem i njegovom jedinicom kako bismo spriječili pogreške u izračunima.

JSR-363 (ranije JSR-275 ili javax.mjera biblioteka) pomaže nam uštedjeti vrijeme za razvoj, a istovremeno čini kôd čitljivijim.

2. Ovisnosti Mavena

Krenimo jednostavno s ovisnošću Mavena da uvučemo knjižnicu:

 javax.mjera jedinica-api 1.0 

Najnoviju verziju možete pronaći na Maven Central.

The jedinica-api projekt sadrži skup sučelja koja definiraju način rada s količinama i jedinicama. Za primjere ćemo upotrijebiti referentnu implementaciju JSR-363, koji je jedinica-ri:

 tec.jedinice unit-ri 1.0.3 

3. Istraživanje API-ja

Pogledajmo primjer gdje želimo spremiti vodu u spremnik.

Naslijeđena implementacija izgledala bi ovako:

javna klasa WaterTank {javna praznina setWaterQuantity (dvostruka količina); }

Kao što vidimo, gornji kod ne spominje jedinicu količine vode i nije prikladan za precizne izračune zbog prisutnosti dvostruko tip.

Ako programer pogrešno prenese vrijednost s jedinicom mjere koja nije ona koju očekujemo, to može dovesti do ozbiljnih pogrešaka u izračunima. Takve je pogreške vrlo teško otkriti i riješiti.

The JSR-363 API nam pruža Količina i Jedinica sučelja, koji rješavaju ovu zbrku i ostavljaju takve pogreške izvan opsega našeg programa.

3.1. Jednostavan primjer

Sada, istražimo i vidimo kako ovo može biti korisno u našem primjeru.

Kao što je ranije spomenuto, JSR-363 sadrži the Količina sučelje koje predstavlja kvantitativno svojstvo kao što su volumen ili površina. Biblioteka nudi brojna podsučelja koja modeliraju najčešće korištene kvantificirane atribute. Neki primjeri su: Volumen, Duljina, Električno punjenje, Energija, Temperatura.

Možemo definirati Količina objekt koji bi trebao pohraniti količinu vode u našem primjeru:

javna klasa WaterTank {public void setCapacityMeasure (Quantity capacityMeasure); }

Osim Količina sučelje, možemo koristiti i Jedinica sučelje za prepoznavanje mjerne jedinice svojstva. Definicije za često korištene jedinice mogu se naći u jedinica-ri knjižnica, kao što su: KELVIN, METAR, NEWTON, CELSIUS.

Predmet tipa Količina ima metode za dohvaćanje jedinice i vrijednosti: getUnit () i getValue ().

Pogledajmo primjer postavljanja vrijednosti za količinu vode:

@Test javna praznina givenQuantity_whenGetUnitAndConvertValue_thenSuccess () {WaterTank waterTank = new WaterTank (); waterTank.setCapacityMeasure (Quantities.getQuantity (9.2, LITER)); assertEquals (LITER, waterTank.getCapacityMeasure (). getUnit ()); Količina waterCapacity = waterTank.getCapacityMeasure (); dvostruki volumenInLitre = waterCapacity.getValue (). doubleValue (); assertEquals (9.2, volumeInLitre, 0.0f); }

To također možemo pretvoriti Volumen u LITER na bilo koju drugu jedinicu brzo:

dvostruki volumenInMilliLitre = kapacitet vode .to (MetricPrefix.MILLI (LITER)). getValue (). doubleValue (); assertEquals (9200,0, volumeInMilliLitre, 0,0f);

Ali, kada količinu vode pokušamo pretvoriti u drugu jedinicu - koja nije tipa Volumen, dobivamo pogrešku u kompilaciji:

// pogreška kompilacije waterCapacity.to (MetricPrefix.MILLI (KILOGRAM));

3.2. Parametrizacija razreda

Da bi se održala dosljednost dimenzija, okvir prirodno koristi prednosti generičkih lijekova.

Klase i sučelja parametrizirani su prema vrsti količine, što omogućuje provjeru naših jedinica u vrijeme sastavljanja. Kompajler će dati pogrešku ili upozorenje na temelju onoga što može prepoznati:

Jedinica kilometar = MetricPrefix.KILO (METER); Jedinica centimetar = MetricPrefix.CENTI (LITR); // pogreška kompilacije

Uvijek postoji mogućnost zaobilaženja provjere tipa pomoću asType () metoda:

Jedinica inča = CENTI (METAR) .vremena (2,54) .asType (dužina.razred);

Također možemo koristiti zamjenski znak ako nismo sigurni u vrstu količine:

Jedinica kelvinPerSec = KELVIN.divide (SECOND);

4. Pretvorba jedinice

Jedinicas može se preuzeti iz SystemOfUnits. Referentna provedba specifikacije sadrži Jedinice implementacija sučelja koje pruža skup statičkih konstanti koje predstavljaju najčešće korištene jedinice.

Osim toga, također možemo stvoriti potpuno novu prilagođenu jedinicu ili stvoriti jedinicu primjenom algebarskih operacija na postojećim jedinicama.

Prednost upotrebe standardne jedinice je što ne nailazimo na zamke pretvorbe.

Također možemo koristiti prefikse ili množitelje iz MetricPrefix razred, poput KILO (Jedinica jedinice) i CENTI (Jedinica jedinice), koji su ekvivalentni množenju i dijeljenju sa potencijom od 10.

Na primjer, "Kilometar" i "Centimetar" možemo definirati kao:

Jedinica kilometar = MetricPrefix.KILO (METER); Jedinica centimetar = MetricPrefix.CENTI (METER);

Oni se mogu koristiti kada jedinica koju želimo nije izravno dostupna.

4.1. Prilagođene jedinice

U svakom slučaju, ako jedinica ne postoji u sustavu jedinica, možemo stvoriti nove jedinice s novim simbolima:

  • AlternateUnit - nova jedinica iste dimenzije, ali različitog simbola i prirode
  • ProductUnit - nova jedinica stvorena kao proizvod racionalnih moći drugih jedinica

Stvorimo neke prilagođene jedinice pomoću ovih klasa. Primjer za AlternateUnit za pritisak:

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

Slično tome, primjer ProductUnit i njegova konverzija:

@Test javna praznina givenUnit_whenProduct_ThenGetProductUnit () {Jedinica squareMetre = METRE.multiply (METER) .asType (Area.class); Linija količine = Quantities.getQuantity (2, METER); assertEquals (line.multiply (line) .getUnit (), squareMetre); }

Ovdje smo stvorili kvadratni metar složena jedinica množenjem METAR sa sobom.

Dalje, tipovima jedinica, okvir također daje a Pretvarač jedinica klase, koja nam pomaže pretvoriti jednu jedinicu u drugu ili stvoriti novu izvedenu jedinicu tzv TransformedUnit.

Pogledajmo primjer pretvaranja jedinice dvostruke vrijednosti, s metara na kilometre:

@Test javna praznina givenMeters_whenConvertToKilometer_ThenConverted () {double distanceInMeters = 50,0; UnitConverter metreToKilometre = METRE.getConverterTo (MetricPrefix.KILO (METER)); dvostruka distanceInKilometers = metreToKilometre.convert (distanceInMeters); assertEquals (0,05, distanceInKilometers, 0,00f); }

Kako bi olakšala nedvosmislenu elektroničku komunikaciju količina sa svojim jedinicama, knjižnica nudi Format jedinice sučelje, koja asocira na oznake širom sustava Jedinice.

Provjerimo oznake nekih sistemskih jedinica pomoću SimpleUnitFormat provedba:

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

5. Izvođenje operacija s količinama

The Količina sučelje sadrži metode za najčešće matematičke operacije: dodati(), oduzeti(), pomnožiti(), podijeliti(). Pomoću njih možemo obavljati operacije između Količina objekti:

@Test javna praznina givenUnits_WhenAdd_ThenSuccess () {Ukupna količina = Količine.getQuantity (2, METER) .add (Quantities.getQuantity (3, METER)); assertEquals (total.getValue (). intValue (), 5); }

Metode također potvrđuju Jedinice objekata na kojima operiraju. Na primjer, pokušaj množenja brojila s litrama rezultirat će pogreškom u sastavljanju:

// pogreška kompilacije Ukupna količina = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, LITER));

S druge strane, mogu se dodati dva objekta izražena u jedinicama koje imaju istu dimenziju:

Količina ukupnoKm = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, MetricPrefix.KILO (METER))); assertEquals (totalKm.getValue (). intValue (), 3002);

U ovom primjeru, jedinice metra i kilometra odgovaraju Duljina dimenzija kako bi ih se moglo dodati. Rezultat se izražava u jedinici prvog objekta.

6. Zaključak

U ovom smo članku to vidjeli Jedinice mjerenja API daje nam prikladan model mjerenja. I, osim upotrebe Količina i Jedinica, također smo vidjeli kako je zgodno pretvoriti jednu jedinicu u drugu, na više načina.

Za dodatne informacije projekt uvijek možete pogledati ovdje.

I kao i uvijek, cijeli je kôd dostupan na GitHub-u.


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