Si encuentra que hay un método de definición en una interfaz:
cadena pública [] getParameters ();
Entonces debes reflexionar seriamente. La matriz no solo es antigua, sino que tenemos razones razonables para evitar la exposición. En este artículo, intentaré resumir los defectos de la matriz en la API Java. Comience con uno de los ejemplos más inesperados.
La matriz conduce a un bajo rendimiento
Puede pensar que el uso de matrices es el más rápido porque la matriz es la estructura de datos subyacente implementada por la mayoría de las colecciones. ¿Cómo puede el uso de un grupo de números puro más bajo que usar un objeto de matriz?
Comencemos con este uso de hábito común que parece familiar:
Public String [] getNames () {return NamesList.ToArray (new String [NamesList.Size ()]);} Este método crea un datos de una colección de variables donde se utilizan sus datos de preservación interna. es más lento (consulte la barra verde vs naranja en la tabla):
public String [] getNames () {return NamesList.ToArray (nueva cadena [0]);} Sin embargo, si el método devuelve una lista, crear una copia defensiva es más rápida (barra roja):
Lista pública <String> getNames () {return New ArrayList (NamesList);} La diferencia es que una lista de matrices coloca su elemento de datos en una matriz de objeto [], y utiliza un tipo de método de toArray, que es mucho más rápido que el tipo de método (barra azul). Sin tipo de matriz, la encapsulación se encapsula en el tipo genérico del compilador.
Este icono muestra un estándar de referencia para N = 5 en Java 7. Sin embargo, más elementos de datos u otro sistema de situación de VM, esta imagen no cambiará demasiado. Convertido en una colección para usarlo para hacer cualquier cosa, y luego convertir el resultado en una matriz para enviarlo a otro método de interfaz, y así sucesivamente.
Utiliza una lista de matrices simple en lugar de una matriz para mejorar el rendimiento. bytes.
Usando una colección, incluso puede decidir devolver una versión no modificada de la lista interna:
Lista pública <String> getNames () {return Collections.unmodifiablelist (NamesList);}Esta operación se ejecutará a un precio de mercado fijo, por lo que es mucho más rápido que cualquier otro método (barra amarilla). Un incapaz de modificar el cambio cambiará cuando cambie sus datos internos. Si el cambio ocurre, el cliente se ejecuta a una medición de modificación concurrente cuando los elementos de datos iterados pueden considerarse como un mal diseño. , será una elección de alto rendimiento, algunas cosas que no pueden ser implementadas por matrices.
La matriz define una estructura, no una interfaz
Java es un lenguaje orientado al objeto. El concepto central de objeto es proporcionar algunos métodos para acceder y operar sus datos en lugar de operar directamente el dominio de datos.
Dado que Java ha diseñado el rendimiento, los tipos y las matrices nativas se han integrado en el sistema de tipos. De acceso directo, no tiene muchas otras cosas que hacer en la matriz.
String [] array = {"foo", "bar"}; Println (array); //-> [ljava.lang.string;@6f548414 list.equals (arrays.aslist ("foo", "bar")) //-> truerray.equals (nueva cadena [] "," Bar "}) // -> falsoA diferencia de la matriz, la API de la colección proporciona muchos métodos útiles para acceder a los elementos. y mantener el principio de implementación al mismo tiempo.
Al usar un datos, define dónde se conservan los datos en la memoria.
La matriz no es un tipo seguro
Si confía en el tipo de verificación del compilador, tenga cuidado con la matriz de objetos.
Número [] números = nuevo entero [10];
La razón es que la matriz es "colaborativa". Cubriendo todas las teorías y todas las teorías, cada desarrollador de Java debe leer.
Debido a este comportamiento, la interfaz del tipo de matriz expuesta permite un sub -tipo de una declaración de tipo de matriz, que causa una extraña anormalidad de tiempo de ejecución.
Bloch también explicó que la matriz no es compatible con el tipo genérico.
-Joshua Block, Java efectivo (2ª edición), Artículo 29
Resumir
La estructura del lenguaje de la capa inferior de la matriz y se utilizarán en la implementación, pero no deben pensar en otras clases de exposición. .