final variable

current186

Mitglied
Hallo zusammen,

Warum meckert mein compiler, wenn ich einer final variable unter einer Bedingung einen Wert zuweisen will?
Java:
public class TestClass {

	// attributes
	private final String name;
	private int age;

	// constructor
	public TestClass(String name, int age) {
		if(name != null && name.length()>=3){
			this.name = name;
			this.age = age;
		}
	}

	// methodes
	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	//Main Class
	public static void main(String[] args) {
		TestClass ppl = new TestClass("Kai", 13);
		System.out.println(ppl.getName()+" "+ppl.getAge());
		ppl.setAge(14);
		System.out.println(ppl.getName()+" "+ppl.getAge());
	}
}

wohingegen eine deklaration ohne Bedingung problemlos funktioniert.
Java:
public class TestClass {

	// attributes
	private final String name;
	private int age;

	// constructor
	public TestClass(String name, int age) {
			this.name = name;
			this.age = age;
	}

	// methodes
	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	//Main Class
	public static void main(String[] args) {
		TestClass ppl = new TestClass("Kai", 13);
		System.out.println(ppl.getName()+" "+ppl.getAge());
		ppl.setAge(14);
		System.out.println(ppl.getName()+" "+ppl.getAge());
	}
}

thx 4 help.
 
Du musst die finale Variable spätestens im Konstruktor initialisieren und da du halt eine Bedingung benutzt, die unter Umständen halt auch false sein könnte wird somit die variable auch nicht initialisiert...hänge einen else Block dran und initialisiere this.name mit einem Default-Wert, dann dürfte es wieder gehen...
 
Mhm, doch eig. schon:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 6.6 Klassen- und Objektinitialisierung

Wie die Beispiele im vorangegangenen Abschnitt zeigen, werden Objektvariablen erst im Konstruktor gesetzt und statische Variablen in einem static-Block. Diese Tatsache müssen wir jetzt mit finalen Variablen zusammenbringen, was uns dazu bringt, dass auch sie in Konstruktoren beziehungsweise in Initialisierungsblöcken zugewiesen werden. Im Unterschied zu nicht-finalen Variablen müssen finale Variablen auf jeden Fall gesetzt werden, und nur genau ein Schreibzugriff ist möglich.

😀
 

Zurück
Oben