sort - java collections example
API java 5 y más: ¿debería devolver una matriz o una colección? (4)
En el espíritu de las mejores prácticas: siempre devuelvo un ____, nunca un ____ , me enfrento a una pregunta similar en mi próxima migración de JDK1.4.2 a JDK5 y más . (Sí, lo sé , JDK1.4.2 es EOL! ;-)).
Para las funciones que devuelven una colección (que no son simples colecciones de propiedades ), siempre prefiero (en JDK1.4.2) devolver una matriz en lugar de una lista genérica, porque:
- impone el tipo de devolución (
MyObject[]
lugar de List of Objects, mucho más type-safe en un nivel estático - como en ''compilación'' -) - sugiere un carácter de "solo lectura" para la colección devuelta (es más complicado agregar un elemento 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 dentro de la matriz todavía se pueden modificar ...
Por supuesto, siempre creo esta matriz devuelta (no expongo ninguna matriz ''interna'')
Ahora, en JDK5 y más, podría usar List<MyObject>
si quisiera.
¿Cuáles son las buenas razones para elegir devolver MyObject[]
lugar de List o Collection<MyObject>
al codificar en java5?
Bonus, si se usa Collection<MyObject>
, es posible:
- hacer cumplir un atributo de solo lectura en la colección devuelta? (no es posible
add()
oremove()
) - imponer un aspecto inmutable a la colección devuelta? (incluso las referencias de esa colección no se pueden modificar)
PD: JavaGenericFAQ no tenía ese.
Consulte los métodos * no modificables en la clase Collections
para hacer que las colecciones devueltas sean de solo lectura / inmutables. Esto envolverá la colección original en una lista que impide el acceso a cambiar la lista en sí (los elementos en sí mismos no son inmutables).
unmodifiableList por ejemplo.
Para mí, depende de cómo se usará la lista devuelta. ¿A qué otros métodos se está transfiriendo y cómo se usará? En general, preferiría la colección genérica sobre una matriz, pero la cambiaría caso por caso.
La matriz probablemente también funcionará más rápido si estás haciendo algo crítico.
En realidad, las matrices aún tienen una ventaja sobre las Colecciones / Listas. Debido a la forma en que Java implementa Genéricos a través del borrado de tipos, no puede tener dos métodos que toman Colecciones como argumentos, pero solo difieren según el tipo genérico de la Colección.
Ex:
public void doSomething(Collection<String> strs) { ... }
public void doSomething(Collection<Integer> ints) { ... }
Los dos métodos anteriores no se compilarán porque el compilador javac usa el borrado de tipo y, por lo tanto, no puede pasar la información del tipo a la JVM. La JVM solo verá dos métodos que toman una colección como argumento.
En los casos anteriores, la mejor solución es hacer que los métodos tomen arrays como argumentos y usar el método Collection / List toArray () al pasarles los argumentos. Si aún desea usar Collection / List dentro de los métodos anteriores, simplemente use el método java.util.Arrays.asList () para recuperar su Lista.
Ex:
public void doSomething(String[] strs) {
List<String> strList = Arrays.asList(strs);
...
}
public void doSomething(Integer[] ints) {
List<Integer> intList = Arrays.asList(ints);
...
}
public static void main(String[] args) {
List<String> strs = new ArrayList<String>();
List<Integer> ints = new ArrayList<Integer>();
obj.doSomething(strs.toArray());
obj.doSomething(ints.toArray());
}
Mi respuesta fue downvoted porque uso proxy para la clase y el uso de ese tipo de cosas (proxy y reflexión) es forbidten porque afecta el rendimiento de las mentes de algunas personas (muchas personas ni siquiera usan el reflejo, sin embargo, usan hibernate y spring que usan relfection , class proxy y xml).
Enhancer del proyecto cglib.sourceforge.net, permite crear proxy para clases (JDK solo admite proxies para interfaces). Proxy le permite controlar los métodos en el objeto, sin embargo, no puede acceder a los campos utilizando reflexiones. si tiene alguna pregunta, pregunte.
Prefiere Collection (o List, o Set según corresponda) a una matriz. Con los genéricos, obtiene la verificación de tipo que faltaba antes de Java 5. Además, al exponer solo la interfaz, puede cambiar la implementación más tarde (por ejemplo, cambiar una Lista de Arrajes por una Lista Vinculada).
Arrays y genéricos no se mezclan muy bien. Por lo tanto, si desea aprovechar los genéricos, generalmente debe evitar las matrices.
Es decir: 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.
Usando Collections.unmodifiableCollection (y métodos similares), obtienes la restricción de solo lectura (que no puedes lograr con una matriz; tendrás que devolver una copia de la matriz).
No se puede forzar la inmutabilidad de los miembros, pero tampoco se puede hacer con una matriz.