HOWTO · Java
Ein Array im Konstruktor initialisieren in Java
In diesem Beitrag geht es darum, ein Array im Konstruktor in Java zu initialisieren.
Auf dieser Seite
Wenn Sie ein Java-Objekt erstellen, initialisieren Sie ein Array-Feld im Konstruktor, wenn sein Anfangsinhalt von Konstruktorargumenten oder anderen Einrichtungsschritten abhängt. Wenn die Standardwerte von Java ausreichen, genügt es, das Feld mit einem Array zu belegen. Ein Array, das im Konstruktor als lokale Variable deklariert wird, ist nur während dieses Konstruktoraufrufs verfügbar und wird nicht zum Objektzustand.
Ein Array-Feld in einem Java-Konstruktor initialisieren
Deklarieren Sie das Array als Instanzfeld und weisen Sie ihm anschließend im Konstruktor eine Array-Referenz zu. Der Konstruktor wird für jedes neue Objekt ausgeführt. Deshalb kann er das Feld anhand der Eingaben für dieses Objekt setzen oder Werte vorbereiten, die für dieses Objekt berechnet wurden.
Ein Array-Feld und das Array, auf das es verweist, sind zwei verschiedene Dinge: Das Feld enthält eine Referenz, das Array dagegen die Elemente. Wenn Sie das Array mit new int[size] erstellen, wird Speicher für seine Elemente reserviert und jedes Element erhält einen Standardwert. Weisen Sie einem Feld ein lokales Array zu, etwa mit this.values = values, speichert das Feld diese Referenz. Verwenden Sie eine Kopie, wenn das Objekt unabhängige Inhalte besitzen soll.
Die Standardwerte von Java für ein Array verwenden
Java weist Instanzfeldern Standardwerte zu, bevor der Rumpf des Konstruktors ausgeführt wird. Erstellt der Konstruktor ein Array, initialisiert Java auch dessen Elemente: Numerische primitive Elemente beginnen mit null (0 bei Ganzzahltypen und 0.0 bei float und double), char-Elemente mit \u0000, boolean-Elemente mit false und Referenzelemente wie String mit null.
Zum Beispiel erstellt private int[] values = new int[3]; ein Instanzfeld mit drei Elementen, deren Wert null ist. Sie können stattdessen private int[] values; deklarieren und im Konstruktor values = new int[3]; zuweisen; die Elemente beginnen weiterhin mit null. Fügen Sie keine Schleife hinzu, die dieselben Werte setzt, sofern die Zuweisung nicht eine zusätzliche Anforderung ausdrückt.
Bestimmte Werte im Konstruktor zuweisen
Verwenden Sie für feste Inhalte einen Array-Initialisierer oder übergeben Sie Werte als Konstruktorparameter, wenn jedes Objekt mit vom Aufrufer vorgegebenen Inhalten beginnen soll. Zum Beispiel weist this.values = new int[] {1, 2, 3}; dem Feld diese drei Werte zu. Ein Konstruktor mit Parametern kann die Eingabe direkt zuweisen oder kopieren – je nachdem, ob spätere Änderungen am Array des Aufrufers sich auch auf das Objekt auswirken sollen.
Das folgende Beispiel fasst mehrere Ansätze in einer Klasse zusammen. Es erstellt ein Feld mit Standardwerten, kopiert übergebene Werte, füllt ein weiteres Feld mit einem einzelnen Wert, berechnet Werte anhand ihrer Indizes und verwendet während der Konstruktion ein lokales Array. Das Programm zeigt die einzelnen Arrays an, sodass Sie die passenden Teile für Ihre Klasse übernehmen können.
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));
}
}
Ein Array lokal im Konstruktor erstellen
Eine Deklaration wie int[] local = {4, 5}; innerhalb eines Konstruktors erstellt eine lokale Variable. Der Code in diesem Konstruktor kann die Variable verwenden, andere Methoden können nach der Rückkehr des Konstruktors jedoch nicht mehr darauf zugreifen. Soll das Array zum Zustand des erstellten Objekts gehören, weisen Sie es stattdessen einem Instanzfeld zu, zum Beispiel mit this.values = new int[] {4, 5};.
Ein lokales Array kann weiterhin als vorübergehende Eingabe beim Erstellen eines Feldes oder für eine Berechnung nützlich sein, die nur während der Einrichtung benötigt wird. Achten Sie auf den Unterschied: Das Array-Objekt bleibt erreichbar, wenn ein Feld oder ein anderes Objekt seine Referenz speichert. Eine lokale Variable im Konstruktor allein hält es jedoch nicht verfügbar.
Arrays.copyOf(), Arrays.fill() oder Arrays.setAll() verwenden
Wählen Sie die Hilfsmethode danach aus, wie die Inhalte bestimmt werden. Arrays.copyOf(source, source.length) erstellt ein separates Array mit den Elementen des Quellarrays. Bei einer kürzeren oder längeren gewünschten Länge werden so viele Elemente kopiert, wie hineinpassen. Zusätzliche Elemente einer längeren Kopie erhalten den Standardwert ihres Typs. Bei Objekt-Arrays handelt es sich um eine flache Kopie: Die Referenzen werden kopiert, die referenzierten Objekte jedoch nicht dupliziert.
Verwenden Sie Arrays.fill(array, value), wenn jedes Element denselben Wert erhalten soll. Mit Arrays.setAll(array, index -> expression) berechnen Sie jeden Wert anhand seines Index. Im Beispiel weist der Füllvorgang dem gesamten Array den Wert 7 zu, während die Indexfunktion aufeinanderfolgende gerade Zahlen einsetzt. Diese Methoden ändern das übergebene Array; sie erstellen kein Ersatzarray.
Einen Initialisierungsansatz auswählen
Verwenden Sie ein Array mit festgelegter Länge und verlassen Sie sich auf die Standardwerte, wenn diese den gewünschten Anfangszustand darstellen. Nutzen Sie für eine kleine, feste Wertemenge einen Array-Initialisierer oder Konstruktorparameter, wenn die Aufrufer die Inhalte festlegen. Kopieren Sie ein Eingabearray, wenn das Objekt eine eigene Array-Struktur benötigt. Verwenden Sie Arrays.fill() für einen überall gleichen Wert und Arrays.setAll() für indexbasierte Werte. Deklarieren Sie das Array als Instanzfeld, wenn es nach der Konstruktion als Objektzustand verfügbar bleiben muss.