Final

Aus Programmieren-Wiki
🚧 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;
	}
}