2010-07-14 8 views
8

¿Es esta una mala práctica?genéricos de apilamiento

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

Me duele la cabeza, pero hasta donde sé, se considera aceptable. –

+2

¿Cómo defines las malas prácticas en tu ejemplo? –

+0

Es obvio para el ojo que es una mala práctica. –

Respuesta

4

Esto no es necesariamente una mala práctica. Es simplemente "ilegible". Tener un poco de paciencia, en la próxima Java 7 se le permite omitir la costra en tipos genéricos específicos cuando se construye el tipo parametrizado:

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

Esto se llama type inference.

A partir de ahora, si se puede vivir con las advertencias del compilador, también puede simplemente hacer esto:

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

Creo que también se podría crear un método de fábrica que parezca 'público estático List createArrayList()' y luego invocar eso en lugar del constructor. La inferencia de tipo determinará automágicamente qué se basa en el tipo de asignación. – Mike

+0

o simplemente usa la clase 'Lists' de Guava y reemplazó la llamada del constructor con' Lists.newArrayList() '. Esto hace exactamente lo que Mike propuso. – whiskeysierra

2

Bueno, ¿necesita tener una Lista cuyos elementos son Listas cuyos elementos son Listas? No tenemos idea de qué es lo que estás tratando de lograr a menos que nos lo digas.

Sin embargo, usar ArrayList directamente en lugar de List es una mala práctica.

+0

Tiene toda la razón, gracias. No tengo idea de por qué no hice la lista para empezar. – rhombidodecahedron

1

Depende de cómo va a utilizar esto. Quizás podría encapsular la lista de dos dimensiones y terminar con un List<TwoDimensionalList<Double>>. Es de suponer que tendría operaciones como TwoDimensionalList.get(int i, int j) para obtener un elemento en la posición j de la lista i.

editar: si no es una lista de dos listas dimensionales, sino una lista tridimensional, entonces por supuesto que desea un ThreeDimensionalList. (y si las dimensiones de su lista son fijas, puede implementar esto internamente con una sola matriz (lista) donde el elemento (i,j,k) se encuentra en la posición i*dim1 + j*dim2 + k*dim3).

7

Es una matriz tridimensional basada en ArrayList. No se ve bien, pero así es como tenemos que escribirlo.

Una alternativa podría ser:

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

que es un poco más corto y por lo general bien, ya que en la mayoría de los casos, su simplemente interesados ​​en los métodos de interfaz.

Si necesita una estructura de datos de matriz tridimensional de tamaño variable, este es un enfoque limpio.

4

Probablemente sería una buena idea crear una nueva clase para manejar el comportamiento que está tratando de lograr. Crearía una clase que usa un ArrayList<...> privado (favorecer la delegación sobre la herencia) y crear los métodos necesarios. En todo caso, debería facilitar las cosas para leer y comprender.

0

Por lo menos, nombrarlo más expresivamente, algo así como 3dList, ayudaría. Preferido, para mí, es escribir una encapsulación personalizada de la lista 2D/3D, como otros han sugerido anteriormente.

+0

Buena sugerencia, pero en Java, los identificadores no pueden comenzar con un número. Inventar algo mejor;) – BalusC

+0

ThreeDimensionalList? ThreeDList? – whiskeysierra

3

sí. lo más probable es que su código sea mejor con double[][][]

+0

Esta es probablemente una mejor opción si va en busca de una matriz tridimensional de dobles, ya que es probable que ArrayList de ArrayLists of ArrayLists of Double ocupe mucho más espacio si no se trata de una matriz dispersa. –

+0

En general, estás en lo correcto. Los programadores de Java rutinariamente subestiman la sobrecarga de memoria que introducen los objetos. Sin embargo, si necesita que su matriz se pueda redimensionar sobre la marcha, y sabe de antemano que la varianza de tamaño será difícil de predecir por adelantado, entonces podría necesitar utilizar el enfoque de "pila o genéricos". Especialmente porque, a diferencia de C, las matrices no pueden redimensionarse dinámicamente en Java. – rtperson