Final
🚧 | 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:
- 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
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;
}
}