In verschiedenen typenlosen Programmiersprachen kann man in ein Array verschiedene Datentypen platzieren. In der typenbehafteten Sprache Java ist das etwas umständlicher. Mit einem kleinen Trick kann eine Funktion trotzdem verschiedene Datentypen zurückgeben.
Das Problem
Ich konstruiere hier ein kleines Problem. Nehmen wir mal an, wir möchten eine Funktion schreiben, welche uns den Flächeninhalt, sowie das Volumen eines Quadrats bzw. Würfels ausgibt. Als Eingabe erhält diese Funktion nur Seitenlänge als Integer.
public int[] SurfaceVolume(int x) {
int[] retarr = new int[2];
int[0] = x*x; //surface
int[1] = x*x*x; //volume
}
Das würde nun ohne Weiteres funktionieren. Gehen wir aber mal davon aus, dass wir den Volumen-Anteil als Double zurückgeben möchten. Dann stehen wir von dem Problem, dass wir nicht ein Array aus zwei verschiedenen Datentypen erstellen können.
Hilfsklasse SurfaceVolumeRet
Wir können uns aber eine kleine Klasse schreiben, welche unser Array „ersetzt“, in dem diese die zwei verschiedene Datentypen speichert. Die Klasse könnte so aussehen:
public class SurfaceVolumeRet {
private int __surface;
private double __volume;
public SurfaceVolumeRet(int surface, double volume) {
this.__surface = surface;
this.__volume = volume;
}
public int getSurface() {
return this.__surface;
}
public int getVolume() {
return this.__volume;
}
}
Nun haben wir uns einfach einen neuen Datentyp erstellt, welcher die zwei verschiedenen Datentypen in sich trägt. Ich habe hier nur Getter-Methoden implementiert, da ich nur lesend auf die Werte zugreifen möchte. Ggf. sollten hier noch die Setter-Methoden implementiert werden. Wir müssen die Funktion nur noch ein wenig anpassen:
public SurfaceVolumeRet SurfaceVolume(int x) {
return new SurfaceVolumeRet(x*x,Double.parseDouble(x*x*x));
}
Wir können dann in der aufrufenden Funktion mit unserem SurfaceVolumeRet-Objekt arbeiten und die entsprechenden Getter-Methoden nutzen, um an die Ergebnisse zu gelangen.
public void aufruf() {
SurfaceVolumeRet ret = SurfaceVolume(x);
System.out.println("Surface: " + String.valueOf(ret.getSurface()));
System.out.println("Volume: " + String.valueOf(ret.getVolume()));
}
~Sebastian