Java Felder mit Werten initialisieren

xXxOrcaxXx

Lt. Junior Grade
Registriert
Nov. 2013
Beiträge
370
Hallo, ich habe in meinem Programm mehrere statische Klassen, die Variablen halten und verwalten. Normale Variablen lassen sich ja schon mit einem Wert definieren, Felder, wie Arrays oder Listen allerdings leider nicht. Ich brauche jedoch diese Felder, wenn ich nicht in jeder Funktion, die auf diese zugreift, erst einmal überprüfn will, ob das Feld schon initialisiert wurde.

Gibt es eine Möglichkeit diese Felder mit Werten zu versehen bevor eine Funktion darauf zugreift?
 
Code:
    private static final int[] numbers = crazyNumbers();
    
    private static int[] crazyNumbers() {
        return new int[] { 1, 2, 3 };
    }
 
Sämtliche Datentypen in Java haben einen default init value. Bei Referenzen null, bei Zahlentypen 0 und bei boolen false. Somit sind auch sämtliche Felder in deinem Array initialisiert.

greetz
​hroessler
 
Code:
import java.util.Arrays;
import java.util.List;

public class Bla2 {

	static int[] array = {1,2,3};
	static List<Integer> list = Arrays.asList(1,2,3);
	static int var;
	
	static int foo(){
		return 7;
	};
	
	static{
		var = foo();
	}

	public static void main(String[] args) {
		System.out.println(Bla2.array[0]);
		System.out.println(Bla2.list.get(1));
		System.out.println(Bla2.var);
	}

}
 
xXxOrcaxXx schrieb:
Normale Variablen lassen sich ja schon mit einem Wert definieren, Felder, wie Arrays oder Listen allerdings leider nicht

Doch, das geht! Du kannst alle direkt bei der Deklaration auch initialisieren, sodass Du später keine NullPointers bekommen kannst.

So könnte es aussehen:

// Array
int[] array1 = { 1, 2, 3, 4, 4, 4, 1 };

// List
List<String> stringList = new ArrayList<>();
 
Wenn du vorher weißt, wie "groß" das Array sein soll dann geht auch :


int[] array = new int[X], wobei X (ganze Zahl) die Größe des arrays ist.
 
Hmm, ich habe jetzt eine List <Integer> = Arrays.asList (...) initialisiert, konnte ihr aber danach nicht mit .add (...) neue Werte hinzufügen. Da bekomm ich vom compiler ne unsupportedOperationExceprion
 
Das liegt an der Implementierung und ist so gewollt - und auch entsprechend dokumentiert.

Code:
List<Integer> myList = new ArrayList<Integer>(Arrays.asList(...));
 
Zwei selbstgeschriebene Klassen (Objekte) oder Integer werte
Ergänzung ()

Ich bin jetzt auf static {} Blöcke umgestiegen, Danke für die Hilfe!
 
Zuletzt bearbeitet:
Die Verwendung von static {} Blöcken sollte man jedoch nur dann verwenden, wenn sie auch sinnvoll sind. Die Idee dahinter von Sun war damals, sie dazu einzusetzen, wenn man mit anonymen Klassen arbeitet, da diese keine Konstruktoren haben, um ihren Zustand zu initialisieren.

Wenn Du nun hier auf die static Initializer setzt, dann spricht das für ein schlechtes Design / Coding.
 
Das Problem ist, damit mein Programm richtig läuft, müssen diese Felder schon vor dem ersten Aufruf mit Startvariablen befüllt sein, müssen sich aber auch während des Programmdurchlaufs aber auch ändern können. Ein static Block erfüllt meine Anforderungen. Falls du eine bessere Möglichkeit kennst würde ich sie gerne hören.
 
Zuletzt bearbeitet:
Das hier:

public class GanzWichtigeKlasse {

// Array
int[] array1 = { 1, 2, 3, 4, 4, 4, 1 };

// List
List<String> stringList = new ArrayList<>();


public int[] getArray1() {
return array1;
}

public List<String> getStringList() {
return stringList;
}

}

Die Klasse ist damit bereits zu Beginn initialisiert. Mit getStringList() kriegst Du eine Referenz auf Deine Liste, auf der Du beliebig diese manipulieren kannst (add(), ...). Beim Array sieht es natürlich anders aus. Im Sinne der Objektorientierung sollten jedoch die Manipulations-Methoden bei der Klasse sein, d.h. Du bestückt die hier gezeigte Klasse mit entsprechenden Methoden.
 
Aber genau bei der liste liegt das Problem. Sie ist zwar initialisiert, aber nicht befüllt. Da ich mehrere funktionen habe, die auf die Liste zugreifen, müsste ich in jeder funktion checken, ob die liste bereits befüllt ist und im Zweifelsfall befüllen. Das ist code-wirrwarr, den ich mir spare, wenn ich den static block benutze und direkt am Anfang befülle.

Auch plane ich arrays einzufügen, die objekte einer selbstgeschriebenen Klasse halten, welche ich logischerweise nicht mit int [] initialisieren, aber leicht mit dem static block befüllen kann.
 
Zuletzt bearbeitet:
xXxOrcaxXx schrieb:
Das Problem ist, damit mein Programm richtig läuft, müssen diese Felder schon vor dem ersten Aufruf mit Startvariablen befüllt sein, müssen sich aber auch während des Programmdurchlaufs aber auch ändern können.
Geht es auch etwas genauer? Mit der Beschreibung kann man nicht viel anfangen.
 
Ich nutze eine Klasse, die mir Objekte der Klasse "Person" baut. Die Objekte der Klasse Person können verschiedene Variablen halten. In meinem Beispiel wäre das int 1 für kind, int 2 für jugendlicher, u.s.w.. Am Anfang sind noch nicht alle Attribute freigeschaltet, so kann die Anfangs erwähnte Klasse keine "Greise" erstellen. Später aber dann schon. Ich brauche also ein Feld, dass zu Anfang schon eine kleine Auswahl an Variablen hält und das sich im Verlauf der Programmausführung beliebig erweitern lässt.
 
Möglich wäre auch

Code:
public static List<Integer> liste = new ArrayList<Integer>() {{
    add(10);
    add(15);
    ..
}}
 
Zurück
Oben