Ich besitze eine Klasse, die je nachdem was für eine Datei eingelesen wird, einen Array von einem bestimmten Typ enthält (Der Typ wird in dem File definiert).
So momentan mache ich es wie folgt:
Habe 3 Arrays
Code:
protected ArrayList<Integer> data01 = new ArrayList<Integer>();
protected ArrayList<Short> data02 = new ArrayList<Short>();
protected ArrayList<Double> data03 = new ArrayList<Double>();
und befülle EINEN davon, je nachdem welcher Datentyp ausgelesen wurde:
ja aber wenn ich alles nach double caste habe ich das Problem dass mir (im Vergleich zu short) viel Platz verloren geht,
also bei sehr großen Datenmengen.
weil ich es auch früher gerne falsch gemacht habe:
der Speicherplatz wird nicht verdoppelt, sondern steigt um 2/3,
von 2560 z.B. auf 4250
und man kann doch trotzdem zwischen Double und Integer sparen
und eine List<Number> kann immer noch alle unterschiedlichen Objekte aufnehmen
und dann sind allerdings diese Objekte sowieso viel größer als primitive Werte,
da solltest du, wenn du wirklich auf Platz Wert legst, int[], double[] usw. verwenden
Der Unterschied ist, dass im ersten Fall die Implementierung nur an das List-Interface gebunden ist. Grundsätzlich sollte man wo es möglich ist Interfaces referenzieren und nicht konkrete Implementationen. Wenn Du später beispielsweise Engpässe mit einer bestimmten Listenimplementierung hast, kannst Du eine neue Implementierung auswählen (oder selbst schreiben) und einfach einsetzen, ohne Gefahr zu laufen, dass an einer anderen Stelle etwas nicht mehr funktioniert, weil implementierungsabhängige (zusätzliche) Methoden verwendet wurden.
im ersten Fall spricht du die Liste über das Interface an. Im 2. direkt über die Klasse.
Im ersten Fall kannst du die ArrayList in eine ? LinkedList wechseln ohne Probleme... im zweiten Fall dürfte das schwerer werden.
Im ersten Fall sagt du nur, das es irgend eine Liste ist, mit den Eigenschaften einer Liste, was es ist aber nicht, im 2 Fall ist es genau diese spezielle Liste (ArrayList) mit ihren speziellen eigenschaften und Methoden...so ca.
Du könntest auch einfach deine "umgebende" Klasse parametrisieren, dann brauchst du auch das seltsame "dataType" nicht (was wenig objektorientiert aussieht):
Code:
public class MeinDateiEinleser<T extends Number> {
protected List<T> dataArray = new ArrayList<T>();
public List<T>getDataArray() {
return dataArray
}
public void addData(T t) {
dataArray.add(t);
}
}
//Angenommen, es ist ein Integer-File
MeinDateiEinleser<Integer> intEinleser = new MeinDateiEinleser<Integer>();
intEinleser.addData(4711)
List<Integer> meineIntList = inteinleser.getDataArray();