2010-07-14 14 views
8

Ist das eine schlechte Praxis?Stacking Generika

+0

Es macht meinen Kopf verletzt, aber soweit ich weiß, ist es akzeptabel. –

+2

Wie definieren Sie schlechte Übung, in Ihrem Beispiel? –

+0

Es ist offensichtlich für das Auge, dass es eine schlechte Praxis ist. –

Antwort

4

Dies ist nicht unbedingt eine schlechte Praxis. Es ist einfach "unlesbar". Haben Sie ein wenig Geduld, in der kommenden Java 7 Sie erlaubt sind die cruft in bestimmten generischen Typen wegzulassen, wenn die parametrisierte Art der Konstruktion:

List<List<List<Double>>> list = new ArrayList<>(); 

Dies wird type inference genannt.

Ab jetzt, wenn Sie mit Compiler-Warnungen leben können, können Sie auch einfach einmal so:

List<List<List<Double>>> list = new ArrayList(); 
+0

Ich denke, Sie könnten auch eine Factory-Methode erstellen, die etwa so aussieht wie public static Liste createArrayList() 'und dann diese anstelle des Konstruktors aufrufen. Die Typinferenz bestimmt automatisch, was auf dem Zuweisungstyp basiert. – Mike

+0

oder verwenden Sie einfach Guavas 'Lists'-Klasse und ersetzte den Konstruktoraufruf durch' Lists.newArrayList() '. Das macht genau das, was Mike vorgeschlagen hat. – whiskeysierra

2

Nun, brauchen Sie eine Liste, deren Elemente Listen sind, deren Elemente Listen sind? Wir haben keine Ahnung, was Sie erreichen wollen, wenn Sie es uns nicht sagen.

Allerdings ist die Verwendung von ArrayList direkt statt List in der Tat eine schlechte Praxis.

+0

Sie haben absolut Recht, danke. Keine Ahnung, warum ich List nicht gemacht habe. – rhombidodecahedron

1

Hängt davon ab, wie Sie dies verwenden möchten. Vielleicht könnten Sie die zweidimensionale Liste einkapseln und mit einem List<TwoDimensionalList<Double>> enden. Vermutlich hätte es Operationen wie TwoDimensionalList.get(int i, int j), um ein Element in der j th-Position der i th Liste zu bekommen.

edit: wenn es keine Liste zweidimensionaler Listen ist, sondern eine dreidimensionale Liste, dann wollen Sie natürlich eine ThreeDimensionalList. (Und wenn die Abmessungen Ihrer Liste festgelegt sind, können Sie dies intern mit einem einzelnen Array (Liste) implementieren, wobei sich das Element (i,j,k) an der Position i*dim1 + j*dim2 + k*dim3 befindet).

7

Es ist eine dreidimensionale Matrix basierend auf ArrayList. Sieht nicht gut aus, aber so müssen wir es schreiben.

könnte eine Alternative sein:

List<List<List<Double>>> list = new ArrayList<List<List<Double>>>(); 

, die wie in den meisten Fällen Ihr nur Interesse an den Interface-Methoden etwas kürzer und in der Regel in Ordnung ist.

Wenn Sie also eine resizable dreidimensionale Matrix-Datenstruktur benötigen, dann ist dies ein sauberer Ansatz.

4

Es wäre wahrscheinlich eine gute Idee, eine neue Klasse zu erstellen, um das Verhalten zu behandeln, das Sie erreichen möchten. Ich würde eine Klasse erstellen, die eine private ArrayList<...> verwendet (Beglaubigung über Vererbung bevorzugen) und erforderliche Methoden erstellen. Wenn überhaupt, sollte es das Lesen und Verstehen erleichtern.

0

Zumindest würde es ausdrücklicher nennen, etwas wie 3dList, würde helfen. Bevorzugt ist für mich, eine benutzerdefinierte Kapselung von 2D/3D-Liste zu schreiben, wie andere oben vorgeschlagen haben.

+0

Netter Vorschlag, aber in Java können Bezeichner nicht mit einer Nummer beginnen. Erfinde etwas besseres;) – BalusC

+0

ThreeDimensionalList? ThreeDList? – whiskeysierra

3

ja. wahrscheinlich ist Ihr Code besser dran mit double[][][]

+0

Dies ist wahrscheinlich eine bessere Wahl, wenn Sie ein dreidimensionales Array von Doubles verwenden, da eine ArrayList von ArrayLists von ArrayLists von Double-Objekten wahrscheinlich viel mehr Platz einnimmt, wenn es kein Sparse-Array ist. –

+0

Im Allgemeinen sind Sie richtig. Java-Programmierer unterschätzen routinemäßig den Speicheraufwand, den Objekte einführen. Wenn Sie jedoch benötigen, dass Ihre Matrix im laufenden Betrieb skalierbar ist und Sie im Voraus wissen, dass die Größenvarianz schwer vorherzusagen ist, dann müssen Sie möglicherweise den Ansatz "Stack o 'Generics" verwenden. Zumal Arrays im Gegensatz zu C nicht dynamisch in Java skaliert werden können. – rtperson