En el espíritu de Best Practices: Always return a ____, never a ____, me enfrento a una pregunta similar en mi próxima migration from JDK1.4.2 to JDK5 and more. (Sí, I saber, JDK1.4.2 is EOL! ;-)).API java 5 y más: ¿Debo devolver una matriz o una colección?
Para funciones que devuelven una colección (que no son simples property collections), siempre prefiero (en JDK1.4.2) devuelve una matriz en lugar de una lista genérica, debido a que:
- se aplica el tipo de regresar (
MyObject[]
en lugar de la lista de objetos, mucho más de tipo seguro en una estática - como en 'compilación' - nivel) - que sugiere un 'sólo lectura' carácter a la colección devuelta (es más complicado agregar un ele a la colección, aunque esto no es tan riguroso como la palabra clave de "solo lectura" en C#). Esto no es lo mismo que decir que es 'inmutable' ya que las referencias encontradas en la matriz todavía pueden ser modificados ...
Por supuesto, yo siempre crear esta volvió array (No exponga ninguno ' matriz interna)
Ahora, en JDK5 y más, podría usar List<MyObject>
si quiero.
¿Cuáles son las buenas razones para elegir devolver MyObject[]
en lugar de List o Collection<MyObject>
al codificar en java5?
bonificación, si se utiliza Collection<MyObject>
, es posible:
- cumplir un atributo de sólo lectura en la colección devuelta? (no
add()
oremove()
posible) - ¿imponer un aspecto inmutable a la colección devuelta? (incluso las referencias de esa colección no se pueden modificar)
PD: El JavaGenericFAQ no tenía exactamente eso.
Gracias! +1 por ahora (esperaré un poco para obtener otras respuestas). Se puede decir que aún no he leído seriamente el javadoc JDK6 ...;) – VonC
"Las matrices y los genéricos no se mezclan muy bien. Por lo tanto, si desea aprovechar los genéricos, generalmente debería evitar los arreglos". -> Urg? ¿Puedes explicar esta parte? Mis matrices se mezclan bien con mis genéricos ... – Nicolas
No puede crear genéricamente una matriz. Por ejemplo, si T es un tipo genérico, entonces "new T [0]" no compila. Tendría que hacer algo como "(T []) nuevo Objeto [0]", que genera una advertencia de lanzamiento no seleccionada. Por la misma razón, no puede usar tipos genéricos con varargs sin advertencias. –