HOWTO · Java
Inicializar un array en el constructor en Java
Este artículo está a punto de inicializar un array en el constructor en Java.
En esta página
Al crear un objeto Java, inicializa un campo de matriz en el constructor si su contenido inicial depende de los argumentos del constructor u otra configuración. Si los valores predeterminados de Java son adecuados, basta con crear el campo. Una matriz declarada como variable local dentro del constructor solo está disponible mientras se ejecuta ese constructor; no pasa a formar parte del estado del objeto.
Inicializar un campo de matriz en un constructor de Java
Declara la matriz como un campo de instancia y asígnale una referencia a una matriz en el constructor. El constructor se ejecuta cada vez que se crea un objeto, por lo que puede establecer el campo a partir de los datos de entrada de ese objeto o preparar valores calculados para él.
El campo de matriz y la matriz a la que hace referencia son elementos distintos: el campo guarda una referencia y la matriz contiene los elementos. Al crear la matriz con new int[size], se reserva espacio para sus elementos y cada uno recibe un valor predeterminado. Si asignas una matriz local a un campo, como en this.values = values, guardas esa referencia; usa una copia si el objeto debe tener contenido independiente.
Usar los valores predeterminados de Java para una matriz
Java asigna valores predeterminados a los campos de instancia antes de que se ejecute el cuerpo del constructor. Cuando el constructor crea una matriz, Java también inicializa sus elementos: los elementos de tipos numéricos primitivos empiezan en cero (0 para los tipos enteros y 0.0 para float y double), los elementos char empiezan en \u0000, los elementos boolean en false y los elementos de referencia, como String, en null.
Por ejemplo, private int[] values = new int[3]; crea un campo de instancia con tres elementos cuyo valor es cero. También puedes declarar private int[] values; y asignarle values = new int[3]; en el constructor; los elementos seguirán empezando en cero. No añadas un bucle para asignar esos mismos valores, salvo que la asignación exprese otro requisito.
Asignar valores específicos en el constructor
Usa un inicializador de matriz para definir un contenido fijo, o recibe valores como parámetros del constructor cuando cada objeto deba empezar con el contenido proporcionado por quien lo crea. Por ejemplo, this.values = new int[] {1, 2, 3}; asigna esos tres valores al campo. Un constructor que recibe parámetros puede asignar directamente la matriz recibida o copiarla, según si los cambios posteriores en la matriz de quien llama también deben afectar al objeto.
El ejemplo siguiente reúne varios enfoques en una clase. Crea un campo con valores predeterminados, copia los valores proporcionados, llena otro campo con un único valor, calcula valores a partir de sus índices y usa una matriz local durante la construcción. El programa muestra cada matriz para que puedas adaptar las partes que correspondan a tu clase.
import java.util.Arrays;
public class ArraySetup {
private final int[] defaults = new int[3];
private final int[] supplied;
private final int[] repeated = new int[3];
private final int[] calculated = new int[3];
public ArraySetup(int[] source) {
supplied = Arrays.copyOf(source, source.length);
Arrays.fill(repeated, 7);
Arrays.setAll(calculated, index -> (index + 1) * 2);
int[] local = {4, 5};
System.out.println("Local: " + Arrays.toString(local));
}
public static void main(String[] args) {
int[] input = {3, 6, 9};
ArraySetup item = new ArraySetup(input);
System.out.println("Defaults: " + Arrays.toString(item.defaults));
System.out.println("Supplied: " + Arrays.toString(item.supplied));
System.out.println("Repeated: " + Arrays.toString(item.repeated));
System.out.println("Calculated: " + Arrays.toString(item.calculated));
}
}
Crear una matriz local en el constructor
Una declaración como int[] local = {4, 5}; dentro de un constructor crea una variable local. El código de ese constructor puede usarla, pero otros métodos no pueden acceder a ella después de que termine el constructor. Si la matriz debe formar parte del estado del objeto creado, asígnala a un campo de instancia; por ejemplo, this.values = new int[] {4, 5};.
Una matriz local también puede servir como entrada temporal para crear un campo o para un cálculo que solo se necesite durante la configuración. Ten clara la diferencia: el objeto matriz puede seguir siendo accesible si un campo u otro objeto guarda su referencia, pero la variable local del constructor, por sí sola, no lo conserva.
Usar Arrays.copyOf(), Arrays.fill() o Arrays.setAll()
Elige el método auxiliar según cómo se determinen los elementos. Arrays.copyOf(source, source.length) crea otra matriz que contiene los elementos de la matriz de origen. Si se solicita una longitud menor o mayor, copia los elementos que caben; los elementos adicionales de una copia más larga reciben el valor predeterminado de su tipo. En las matrices de objetos, la copia es superficial: se copian las referencias, pero no se duplican los objetos a los que apuntan.
Usa Arrays.fill(array, value) cuando todos los elementos deban recibir el mismo valor. Usa Arrays.setAll(array, index -> expression) cuando cada valor se calcule a partir de su índice. En el ejemplo, la operación de relleno asigna 7 a todos los elementos, mientras que la función basada en índices asigna números pares consecutivos. Estos métodos modifican la matriz que reciben; no crean una matriz de reemplazo.
Elegir un método de inicialización
Usa una matriz de tamaño definido y deja que Java aplique los valores predeterminados cuando esos sean los valores iniciales deseados. Usa un inicializador para un conjunto pequeño de valores fijos, o parámetros del constructor cuando quien crea el objeto elija el contenido. Copia una matriz de entrada si el objeto necesita su propia estructura de matriz; usa Arrays.fill() para repetir un valor y Arrays.setAll() para calcular valores según el índice. Declara la matriz como campo de instancia siempre que deba seguir disponible como parte del estado del objeto después de su construcción.