# Einheiten in Java



## PanchoVarallo (6. Okt 2014)

Hallo liebe Leute,

ich programmiere ein bisschen in Java und hantiere mit Daten rum. Diese sind in XML-Files gespeichert und ich bin auch in der Lage diese mit jdom2 zu parsen und zu nutzen. Nun zu meinem eigentlichen Problem.

Das XML-File hat beispielsweise folgende Information:

```
<Durchmesser  value="4.185" unit="m"/>
```

Ich lese das Ganze ein und arbeite mit dem value = 4.185, den ich in einem entsprechenden Objekt speichere, da ich meine eigene Struktur aufgebaut habe. Die Information aus dem Attribut unit lasse ich ungenutzt und gehe einfach von Metern aus. Tsja, und natürlich gibt es jetzt ein anderes File, in dem dann  


```
<Durchmesser  value="45.185" unit="mm"/>
```

steht.  Meine Frage: Wie sollte man seine Klasse aufbauen um mit unterschiedlichen Einheiten umzugehen? Was ist da das Sinnvollste? Eine eigene "Einheiten-Klasse" und dann beim konstruieren der Objekte immer alles in SI-Einheiten umrechnen? Ich hab zwar ein paar Ideen im Kopf, aber bevor ich wie wild drauf losprogrammiere, wollte ich nachfragen, ob es für solche Geschichten eine Standardherangehensweise gibt. 

Ich danke schon einmal ...

Grüße
PanchoVarallo


----------



## Joose (6. Okt 2014)

Es kommt natürlich auch etwas auf den Kontext an was hier zu bevorzugen ist.
Brauchst du die Unit danach wieder zum rausschreiben? Um welche Größenordnung haltet es sich bei den Werten?


Möglichkeit 1: Du hast eine eigene Klasse/Enum für die Einheit und wenn du mit dem Durchmesser rechnen willst musst du diesen Wert umrechnen.

Der Vorteil ist hier das die Basisinformation nicht verloren geht. Der Nachteil ist das du bei jeder Rechnung mit dem Durchmesser möglicherweise umrechnen musst.

Möglichkeit 2: Schon beim Einlesen der Daten kontrollierst du die Unit und rechnest auf deine gewünschte Standard Einheit um wenn notwendig.

Der Vorteil du hast einen Standard Einheit, welche das Umrechnen zur Laufzeit unnötig machen sondern direkt beim Einlesen 1x erledigt. Der Nachteil ist das du nicht mehr weißt welches die eigentliche Einheit dieses Durchmesser war.

Möglichkeit 3: Du rechnest beim Einlesen deinen Wert um, speicherst aber noch die eigentliche Einheit mit.

Der Vorteil liegt vor allem an der Vollständigkeit deiner Daten. Der Nachteil du haltest mehr Daten im Speicher als du vielleicht brauchst.


----------



## nvidia (6. Okt 2014)

PanchoVarallo hat gesagt.:


> [...] Wie sollte man seine Klasse aufbauen um mit unterschiedlichen Einheiten umzugehen? Was ist da das Sinnvollste?



Schau dir mal an wie es z.B. in der JScience-Bibliothek geregelt wurde. Das Problem mit Java ist, das es unglaublich hässlich (optisch) und umständlich (syntaktisch) wird mit "Dimensionen" bzw. "Einheiten" zu rechnen.


----------



## PanchoVarallo (7. Okt 2014)

Danke schon einmal für die schnellen Antworten. Werde ich mir gleich anschauen und dann berichten ...

Grüße
PanchoVarallo


----------



## PanchoVarallo (7. Okt 2014)

Nach weiteren Recherchen präferiere ich für mich jetzt folgende Lösung:

Ich mache folgende enum:


```
public enum LengthUnit
{	
  km() {
    public double convertTo( LengthUnit a, double value )
    {
      return a == km ? value : (a == m  ? value * 1000 : value * 1000000);
    }
  },
  
  m() {
    public double convertTo( LengthUnit a, double value )
    {
      return a == m ? value : (a == km  ? value / 1000 : value * 1000);
    }
  },
  
  mm() {
    public double convertTo( LengthUnit a, double value )
    {
      return a == mm ? value : (a == km  ? value / 1000000 : value / 1000);
    }
  };

  public abstract double convertTo( LengthUnit a, double value );
}
```

und immer wenn ich irgendwo eine Länge definiere nutze ich die folgende Klasse:


```
public class Length {
	
	double value;
	LengthUnit unit;
}
```

Damit habe ich immer schön die Eingabeeinheit gespeichert und kann lässig durch die uberschriebene convertTo()-Methode umrechnen:


```
Length l = new Length(2, LengthUnit.valueOf("km"));
System.out.println(l.getValue() + " " + l.getUnit()); // 2.0 km
System.out.println("Oder in m: " + l.getUnit().convertTo(LengthUnit.m, l.getValue())); // Oder in m: 2000.0
```

Was sagt ihr?

Grüße
PanchoVarallo


----------

