Rechnen mit Einheiten: Java Units Specification

Die Java Units Specification (http://www.jcp.org/en/jsr/detail?id=108), die mittlerweile zurückgezogen wurde, beschreibt Einheiten – wie Meter, Kilogramm – und Konvertierungen zwischen diesen Einheiten sowie Größen und Dimensionen. Ein Beispiel:

Größe (mit Formelzeichen) Dimension SI-Einheit
Länge (l, s) L Meter (= 1/299 792 458 des Lichtweges in 1 s)
Zeit (t) T Sekunde (9 192 631 770 Perioden der 133 Cs-Uhr)
Masse (m) M Kilogramm (kg)
Elektrische Ladung (Q) Q = I • T Coulomb (C) = A • s

Die Dimension einer physikalischen Größe ist ihre Darstellung als Produkt der Basisgrößen. Die Webseite http://tutego.com/go/units listet eine gewaltige Zahl von Maßeinheiten auf und erklärt auch ihre Konvertierung.

Eine Implementierung der Java Units Specification ist J.A.D.E. (Java Addition to Default Environment) von Jean-Marie Dautelle unter http://jscience.org/. J.A.D.E. implementiert neben den Einheiten auch noch andere APIs. Die Bibliothek bietet:

  • Kompatibilität zwischen Einheiten
  • Konvertierung der Größen
  • Skalierung und arithmetische Operationen
  • Standardeinheiten
  • Parser für Einheiten

Die Klasse javax.units.SI beschreibt die Basisgrößen – etwa die Länge in der Basiseinheit Meter, eine Masse in Kilogramm, die Zeit in Sekunden usw. –, und javax.units.NonSI beschreibt die Nicht-SI-Einheiten wie Knoten oder Yard. Die Einheit ist durch die Klasse javax.units.Unit zu beschreiben, und javax.units.Converter ermöglicht die Umwandlung von einer Einheit zur änderen.

J.A.D.E bindet sich in der aktuellen Version nicht mehr an die javax.units-Schnittstellen, sodass die Typen aus dem Paket org.jscience.physics.units zu nutzen sind:

import org.jscience.physics.units.Converter;
import org.jscience.physics.units.NonSI;
import org.jscience.physics.units.SI;
import org.jscience.physics.units.Unit;

public class UnitDemo
{
 public static void main( String[] args )
 {
  Unit unitMeter = SI.METER;
  Unit unitMile = NonSI.MILE;
  System.out.println( unitMeter.getSystemUnit() ); // m
  System.out.println( unitMile.getSystemUnit() ); // m

  boolean b = unitMile.isCompatible( unitMeter ); // true
  // 1 Mile = 1609.344 Meter
  // 1 Meter = 0.0006214 Mile
  Converter conv = unitMeter.getConverterTo( unitMile );
  System.out.println( conv.convert(1000 /* m */ ) ); // 0.621371192237334
 }
}

Damit das Beispiel mit J.A.D.E funktioniert, müssen die beiden Java-Archive jscience.jar sowie javolution.jar in den Klassenpfad mit aufgenommen werden.