Final: Unterschied zwischen den Versionen

Aus Programmieren-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Bewertungsrichtlinie
{{CategoryBlock
|blatt=2
|Baustelle=Ja
|schweregrad=leicht
|Java Grundlagen=Nein
|kategorie=Programmierstil
|Organisation=Nein
|Programmierstil=Ja
|Bewertungsrichtlinie=Ja
|blattAnnotation=2
|blattAbzug=3
}}
{{Inhaltsblock
|vorher==== Beschreibung ===
Wir wollen in unserem Programm dafür sorgen, dass wir entscheiden können, welche Elemente verändert werden dürfen und welche möglichst nicht verändert werden sollten. Dafür gibt es das Schlüsselwort <syntaxhighlight inline lang="Java">final</syntaxhighlight>. Die korrekte Verwendung davon ist wichtig und entsprechend gibt es auch folgende Regeln die beachtet werden sollten:
# Attribute sollten soweit wie möglich final sein
# final ist nur für das jeweilig referenzierte Objekt gültig (Bsp. können Collections wie List final sein, ihr Inhalt kann aber trotz final verändert werden. Siehe dazu auch: [[Getter / Setter für Listen]])
# Der Zustand eines Objektes ist eine unsichtbare Abhängigkeit und kann zu zahlreichen Fehlern führen. Randfälle können demnach auch schnell übersehen werden
}}
{{Inhaltsblock
|color=red
|vorher=Negativbeispiel:
|Beispiel=public class DepartmentBad {
private List<Employee> employees;
 
public DepartmentBad() {
clear();
}
 
public void clear() {
employees = new ArrayList<>();
}
}
|beispielname=FinalBad
}}
{{Inhaltsblock
|color=green
|vorher=Positivbeispiel:
|Beispiel=public class DepartmentGood {
private final List<Employee> employees = new ArrayList<>();
 
//...
 
public void clear() {
employees.clear();
}
}
|beispielname=FinalGood1
}}
{{Inhaltsblock
|color=green
|vorher=Ein weiteres Beispiel:
|Beispiel=class Event {
private static final int BASE_FEE = 1000;                        // constants should be final
private final List<String> participants;                        // fields should be final if possible
 
public Event() {
participants = new ArrayList<>();
}
 
public void addParticipant(String name) {                        // final not required for parameters
participants.add(name);                                      // the list is final, its content is not
}
 
public int calculateProfit(int ticketPrice, int venueCost) {
int fixedCost = BASE_FEE + venueCost;                        // final is not needed for local variables
return participants.size() * ticketPrice - fixedCost;
}
}
|beispielname=FinalGood2
}}
}}
{{Baustelle}}

Aktuelle Version vom 13. Oktober 2025, 15:03 Uhr

🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 2 annotiert und ab Blatt 3 abgezogen wird. 🤓

Beschreibung

Wir wollen in unserem Programm dafür sorgen, dass wir entscheiden können, welche Elemente verändert werden dürfen und welche möglichst nicht verändert werden sollten. Dafür gibt es das Schlüsselwort final. Die korrekte Verwendung davon ist wichtig und entsprechend gibt es auch folgende Regeln die beachtet werden sollten:

  1. Attribute sollten soweit wie möglich final sein
  2. final ist nur für das jeweilig referenzierte Objekt gültig (Bsp. können Collections wie List final sein, ihr Inhalt kann aber trotz final verändert werden. Siehe dazu auch: Getter / Setter für Listen)
  3. Der Zustand eines Objektes ist eine unsichtbare Abhängigkeit und kann zu zahlreichen Fehlern führen. Randfälle können demnach auch schnell übersehen werden

Negativbeispiel:

public class DepartmentBad {
	private List<Employee> employees;

	public DepartmentBad() {
		clear();
	}

	public void clear() {
		employees = new ArrayList<>();
	}
}

Positivbeispiel:

public class DepartmentGood {
	private final List<Employee> employees = new ArrayList<>();

	//...

	public void clear() {
		employees.clear();
	}
}

Ein weiteres Beispiel:

class Event {
	private static final int BASE_FEE = 1000;                        // constants should be final
	private final List<String> participants;                         // fields should be final if possible

	public Event() {
		participants = new ArrayList<>();
	}

	public void addParticipant(String name) {                        // final not required for parameters
		participants.add(name);                                      // the list is final, its content is not
	}

	public int calculateProfit(int ticketPrice, int venueCost) {
		int fixedCost = BASE_FEE + venueCost;                        // final is not needed for local variables
		return participants.size() * ticketPrice - fixedCost;
	}
}