מבוא ל- javax.measure

1. סקירה כללית

במאמר זה נציג את ה- Units of Measurement API - המספק דרך אחידה לייצג מדדים ויחידות ב- Java.

תוך כדי עבודה עם תוכנית המכילה כמויות פיזיות, עלינו להסיר את חוסר הוודאות לגבי יחידות המשמשות. חשוב שננהל את המספר ואת היחידה שלו כדי למנוע טעויות בחישובים.

JSR-363 (לשעבר JSR-275 אוֹ javax.measure הספרייה) עוזר לנו לחסוך את זמן הפיתוח, ובמקביל הופך את הקוד לקריא יותר.

2. תלות Maven

בואו נתחיל פשוט עם התלות של Maven להיכנס לספרייה:

 javax.measure unit-api 1.0 

ניתן למצוא את הגרסה האחרונה ב- Maven Central.

ה יחידת API הפרויקט מכיל מערך ממשקים המגדיר כיצד לעבוד עם כמויות ויחידות. לדוגמאות נשתמש ביישום הייחוס של JSR-363, שזה יחידה-רי:

 יחידות יחידות tec. ri 1.0.3 

3. חקר ה- API

בואו נסתכל על הדוגמה בה אנו רוצים לאגור מים במיכל.

יישום המורשת ייראה כך:

מעמד ציבורי WaterTank {set upaterWaterQuantity ציבור ריק (כמות כפולה); }

כפי שאנו רואים, הקוד לעיל אינו מזכיר את יחידת כמות המים ואינו מתאים לחישובים מדויקים בגלל נוכחותם של לְהַכפִּיל סוּג.

אם מפתח מעביר את הערך בטעות עם יחידת מידה שונה מזו שאנחנו מצפים לה, זה יכול להוביל לשגיאות חמורות בחישובים. קשה מאוד לאתר ולפתור שגיאות כאלה.

ה JSR-363 API מספק לנו את ה- כַּמוּת ו יחידה ממשקים, אשר פותרים את הבלבול הזה ומשאירים שגיאות מסוג זה מחוץ לתחום התוכנית שלנו.

3.1. דוגמה פשוטה

עכשיו, בואו נבדוק ונראה כיצד זה יכול להיות שימושי בדוגמה שלנו.

כפי שהוזכר מוקדם יותר, JSR-363 מכיל ה כַּמוּת ממשק המייצג מאפיין כמותי כגון נפח או שטח. הספרייה מספקת ממשקי משנה רבים המדגמים את המאפיינים הכמתיים הנפוצים ביותר. חלק מהדוגמאות הן: כרך, אורך, מטען חשמלי, אֵנֶרְגִיָה, טֶמפֶּרָטוּרָה.

אנחנו יכולים להגדיר את כַּמוּת אובייקט, אשר אמור לאחסן את כמות המים בדוגמה שלנו:

מעמד ציבורי WaterTank {set public spaceCapacityMeasure (כמות קיבולתMeasure); }

חוץ מה כַּמוּת מִמְשָׁק, אנחנו יכולים גם להשתמש ב- יחידה ממשק לזיהוי יחידת המדידה עבור נכס. ניתן למצוא הגדרות ליחידות המשמשות לעיתים קרובות יחידה-רי ספרייה, כגון: קלווין, מטר, ניוטון, צֶלסִיוּס.

אובייקט מסוג כַּמוּת יש שיטות לאחזור היחידה והערך: לקבל יחידה() ו getValue ().

בואו נראה דוגמה לקביעת הערך לכמות המים:

@ מבחן הריק פומבי givenQuantity_whenGetUnitAndConvertValue_thenSuccess () {WaterTank waterTank = מיכל מים חדש (); waterTank.setCapacityMeasure (Quantities.getQuantity (9.2, LITER)); assertEquals (LITER, waterTank.getCapacityMeasure (). getUnit ()); כמות waterCapacity = waterTank.getCapacityMeasure (); נפח כפולInLitre = waterCapacity.getValue (). doubleValue (); assertEquals (9.2, volumeInLitre, 0.0f); }

אנחנו יכולים גם להמיר את זה כרך ב לִיטר לכל יחידה אחרת במהירות:

נפח כפולInMilliLitre = waterCapacity .to (MetricPrefix.MILLI (LITER)). getValue (). doubleValue (); assertEquals (9200.0, volumeInMilliLitre, 0.0f);

אך כאשר אנו מנסים להמיר את כמות המים ליחידה אחרת - שאינה מסוגה כרך, אנו מקבלים שגיאת אוסף:

// שגיאת אוסף waterCapacity.to (MetricPrefix.MILLI (KILOGRAM));

3.2. פרמטריזציה כיתתית

כדי לשמור על עקביות המימד, המסגרת מנצלת באופן טבעי את הגנריות.

מחלקות וממשקים הם פרמטרים לפי סוג הכמות שלהם, מה שמאפשר לבדוק את היחידות שלנו בזמן הידור. המהדר ייתן שגיאה או אזהרה על סמך מה שהוא יכול לזהות:

קילומטר יחידה = MetricPrefix.KILO (METER); סנטימטר יחידה = MetricPrefix.CENTI (LITER); // שגיאת אוסף

תמיד יש אפשרות לעקוף את בדיקת הסוגים באמצעות ה- asType () שיטה:

סנטימטר יחידה = CENTI (METER). Times (2.54) .asType (Length.class);

אנו יכולים גם להשתמש בתו כללי אם איננו בטוחים בסוג הכמות:

יחידה kelvinPerSec = KELVIN.divide (SECOND);

4. המרת יחידה

יחידהניתן לאחזר מ- SystemOfUnits. יישום הייחוס של המפרט מכיל את יחידות יישום הממשק המספק קבוצה של קבועים סטטיים המייצגים את היחידות הנפוצות ביותר.

בנוסף, אנו יכולים גם ליצור יחידה מותאמת אישית חדשה לחלוטין או ליצור יחידה על ידי יישום פעולות אלגבריות על יחידות קיימות.

היתרון בשימוש ביחידה סטנדרטית הוא שאנחנו לא נתקלים במלכודות ההמרה.

אנו יכולים גם להשתמש בקידומות, או במכפילים מה- MetricPrefix כיתה, כמו KILO (יחידת יחידה) ו CENTI (יחידת יחידה), המקבילים לכפל ולחלק בכוח של 10 בהתאמה.

לדוגמא, אנו יכולים להגדיר את "קילומטר" ו"סנטימטר "כ:

קילומטר יחידה = MetricPrefix.KILO (METER); סנטימטר יחידה = MetricPrefix.CENTI (METER);

ניתן להשתמש בהם כאשר יחידה שאנו רוצים אינה זמינה ישירות.

4.1. יחידות מותאמות אישית

בכל מקרה, אם יחידה לא קיימת במערכת היחידות, אנו יכולים ליצור יחידות חדשות עם סמלים חדשים:

  • AlternateUnit - יחידה חדשה עם אותו ממד אך שונה וסמל וטבע
  • מוצר יחידה - יחידה חדשה שנוצרה כתוצר של כוחות רציונליים של יחידות אחרות

בואו ניצור כמה יחידות מותאמות אישית באמצעות שיעורים אלה. דוגמה של AlternateUnit ללחץ:

@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)); }

באופן דומה, דוגמה ל ProductUnit והמרתו:

@Test public void givenUnit_whenProduct_ThenGetProductUnit () {Unit squareMetre = METRE.multiply (METER) .asType (Area.class); קו כמות = Quantities.getQuantity (2, METER); assertEquals (line.multiply (line) .getUnit (), squareMetre); }

הנה, יצרנו א מטר מרובע יחידה מורכבת על ידי הכפלת מטר עם עצמו.

לאחר מכן, לסוגי היחידות, המסגרת מספקת גם א ממיר יחידה class, שעוזר לנו להמיר יחידה אחת לאחרת, או ליצור יחידה נגזרת חדשה בשם TransformedUnit.

בואו נראה דוגמה להפיכת היחידה לערך כפול, ממטר לקילומטרים:

@Test הציבור בטל givenMeters_whenConvertToKilometer_ThenConverted () {מרחק מרחק כפול = 50.0; UnitConverter metreToKilometre = METRE.getConverterTo (MetricPrefix.KILO (METER)); distanceInKilometers כפול = metreToKilometre.convert (distanceInMeters); assertEquals (0.05, distanceInKilometers, 0.00f); }

כדי להקל על תקשורת אלקטרונית חד משמעית של כמויות עם יחידותיהן, הספרייה מספקת את UnitFormat מִמְשָׁק, המקשר בין תוויות כל המערכת יחידות.

בואו לבדוק את התוויות של כמה יחידות מערכת באמצעות ה- SimpleUnitFormat יישום:

@Test public void givenSymbol_WhenCompareToSystemUnit_ThenSuccess () {assertTrue (SimpleUnitFormat.getInstance (). Parse ("kW") .equals (MetricPrefix.KILO (WATT))); assertTrue (SimpleUnitFormat.getInstance (). ניתוח ("ms"). שווים (SECOND.divide (1000))); }

5. ביצוע פעולות עם כמויות

ה כַּמוּת הממשק מכיל שיטות לפעולות המתמטיות הנפוצות ביותר: לְהוֹסִיף(), להחסיר(), לְהַכפִּיל(), לחלק(). באמצעות אלה נוכל לבצע פעולות בין כַּמוּת חפצים:

@ מבט בטל פומבי givenUnits_WhenAdd_ThenSuccess () {כמות כוללת = Quantities.getQuantity (2, METER). להוסיף (Quantities.getQuantity (3, METER)); assertEquals (total.getValue (). intValue (), 5); }

השיטות גם מאמתות את יחידות מהחפצים שהם פועלים עליהם. לדוגמא, ניסיון להכפיל מטרים עם ליטרים יביא לשגיאת אוסף:

// שגיאת אוסף כמות כוללת = Quantities.getQuantity (2, METER) .add (Quantities.getQuantity (3, LITER));

מצד שני, ניתן להוסיף שני אובייקטים המתבטאים ביחידות בעלות אותו ממד:

כמות totalKm = Quantities.getQuantity (2, METER). להוסיף (Quantities.getQuantity (3, MetricPrefix.KILO (METER))); assertEquals (totalKm.getValue (). intValue (), 3002);

בדוגמה זו יחידות המטר והקילומטר תואמים את ה- אורך מימד כך שניתן יהיה להוסיף אותם. התוצאה מתבטאת ביחידת האובייקט הראשון.

6. מסקנה

במאמר זה ראינו זאת יחידות יחידות של מדידה נותן לנו מודל מדידה נוח. ומלבד השימוש ב- כַּמוּת ו יחידה, ראינו גם כמה נוח להמיר יחידה אחת לאחרת, במספר דרכים.

לקבלת מידע נוסף, אתה תמיד יכול לבדוק את הפרויקט כאן.

וכמו תמיד, כל הקוד זמין ב- GitHub.


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