Main /

Die Klasse Millimeter

Die Klasse Millimeter

Beispiel Implementierung einer Klasse Millimeter, das Objekt soll nur eine Zahl enthalten, die als Type Millimeter ist. Nicht eben aus dem Leben gegriffen. winking smiley

class Millimeter
{
   private int m_nLength;
   public void set(int _n)
   {
      m_nLength = _n;
   }
   public int get()
   {
      return m_nLength;
   }
}

Wenn ich jetzt eine Instanz erstellen will,

Millimeter aMillimeter = new Millimeter();

Schon mal falsch, da es eigentlich keine uninitialisierten Längen gibt. Also Klasse um C'Tors erweitern.

Millimeter()
{
   m_nLength = 0;
}
Millimeter(int _n)
{
   m_nLength = _n;
}

Um hier niemanden zu verwirren, sollte evtl. der C'tor mit der Wertübergabe wieder entfernt werden.

Jetzt habe ich 100mm also

aMillimeter.set(100);

Da ich die interne Representation ja kenne, kann ich mir helfen, die Länge auch in Metern anzugeben:

aMillimeter.set(2 * 1000);

Oder vielleicht in Kilometern. Die Strecke zum Mond ist: 384000km sind 384000(km)000(m)000(mm) also

aMillimeter.set(384000 * 1000 * 1000);

Ich weiß ja, die Klasse hält intern mm. Hoffentlich fliegt mir der Compiler jetzt um die Ohren.

Denn:
Integer ist 32Bit, das sind +-2^31 Werte ca 2mrd.
Aber +-2 mrd mm sind (:1000) 2 million m sind (:1000) nur 2000km!
Somit kann die Millimeter klasse nur ~2000km aufnehmen.

Also die interne Repräsentation ändern auf long (64bit) Das sollte reichen. Doch Vorsicht, 2000 * (2^32)km schafft das Licht in 331.4 Tagen. Also reicht die Strecke auch nur bis kurz hinter die Oortsche Wolke winking smiley.

Eigentlich könnte ich mir get() und set() auch sparen. Schließlich werden keine Berechnungen innerhalb der Klasse durchgeführt...

Ich will meine Werte aber nicht selbst in Millimeter umrechnen, da das ein prima Ort für ganz gemeine logische Fehler ist. Also müssen ein paar extra Funktionen her.

public void setInMeter(int _n)
{
   m_nLength = _n * 1000;
}
public void setInKilometer(int _n)
{
   setInMeter(_n * 1000);
}
public void setInDecimeter(int _n)
{
   m_nLength = _n * 100;
}
public void setInCentimeter(int _n)
{
   m_nLength = _n * 10;
}

Somit ändern sich meine Aufrufe von eben für Meter / Kilometer auf

aMillimeter.setInMeter(2);
aMillimeter.setInKilometer(384000);

Bei den gettern wollen wir das natürlich auch, ich spare mit aber die Implementierung.

public int getMeter();
public int getKilometer();

Vielleicht ist double als Rückgabewert besser?

public double getFeet();
public double getYards();
public double getInch();

Wenn die Werter jetzt aber kleiner werden sollen, müßten wir wieder die Repräsi ändern, da sonst meist 0 herauskommt.

public void setInNanoMeter(_n)
{ ... }
public void setInNanoMeter(_n)
{ ... }

Da ich durch die vielen extra setter/getter Funktionen vernünftige Unterstützung bekomme und die interne Repräsentation jetzt eigentlich keine Rolle mehr spielen sollte, kann ich die jetzt munter auf double oder BigDouble ändern.

siehe auch

zurück zu Java

Frische Änderungen | Menü editieren
zuletzt geändert am 31.10.2006 07:51 Uhr von Elsni
Edit Page | Page History