final und andere Java-Schlüsselwörter - 1

„Hallo, Amigo!“

„Hallo, Bilaabo!“

„Heute werde ich Ihnen einige Schlüsselwörter in Java vorstellen. Aber ich beginne mit dem interessantesten: dem Schlüsselwort final.

„Sie können das Schlüsselwort final verwenden , wenn Sie eine Variable, Methode oder Klasse deklarieren.“

„Und warum brauchen wir das Finale?“

„Es ist ziemlich einfach. Wenn wir eine Variable als endgültig markieren, wird sie unveränderlich:“

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"Ich verstehe."

„Wenn wir eine Methode als final markieren, ist das Überschreiben der Methode in abgeleiteten Klassen verboten:“

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

„Ich verstehe. Aber warum sollten Sie das Überschreiben einer Methode verbieten?“

„Angenommen, ein Programmierer hat eine Menge wichtigen Code in eine Methode geschrieben und möchte sicherstellen, dass alle Klassen, die seine Klasse erben, das angegebene Verhalten aufweisen.“

„Und schließlich die dritte Verwendung.“

„Wenn wir eine Klasse mit dem Schlüsselwort final markieren, dann kann sie nicht vererbt werden.“

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

„Und warum sollten wir verhindern, dass eine Klasse vererbt wird?“

„Sie sollten verstehen, dass wir nicht verhindern, dass die Vererbung störend ist, sondern aus Gründen der Sicherheit und der Codeintegrität. Wenn die Klassenvererbung nicht verboten ist, bedeutet dies, dass sie zulässig ist. Und dass der Code von der Klasse geschrieben wird.“ Der Designer funktioniert ordnungsgemäß für Objekte dieser Klasse sowie für Objekte aller abgeleiteten Klassen.

„Aber wenn ein Entwickler erkennt, dass selbst kleine Änderungen an seiner Klasse dazu führen, dass alles nicht mehr wie erwartet funktioniert, dann ist es besser, die Vererbung zu verbieten.“

„Zum Beispiel wird die String-Klasse als final deklariert, ebenso wie alle primitiven Typen: Integer, Boolean, Double, Character…“

„Ah, verstanden. Die String-Klasse wurde als unveränderliche Klasse erstellt und wenn sie plötzlich veränderbar wäre, würden viele Dinge nicht mehr funktionieren.“

„Naja, fast. Sagen wir mal so: Alles würde fast wie vorher funktionieren, aber manchmal gab es Fehler, die sehr schwer zu finden und zu verstehen wären. In manchen Fällen ist das Erben von Klassen oder Methoden also nicht wirklich eine Sünde, aber es zu verbieten bedeutet, dass später weniger Fehler abgefangen werden müssen.“

„Wo sonst können Sie final verwenden?“

„Sie können final vor Funktionsparametern und vor Variablen in einer Methode verwenden. Hier ist ein Beispiel:“

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

„Und welchen Sinn hat das?“

„Nun, es gibt zwei. Erstens deklarieren wir eine Variable als final, wenn wir anderen Entwicklern mitteilen möchten, dass es sich bei diesem Wert um eine bestimmte Konstante und nicht nur um eine Variable handelt.“

Wir wollen zum Beispiel die Umsatzsteuer anhand eines Preises berechnen:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

„Und zweitens benötigen wir diese Art von Variablen, wenn wir lokale oder anonyme innere Klassen schreiben. Ich werde Ihnen bald etwas über diese Art von Klassen erzählen. Aber nicht heute.“

„Okay, bisher gab es nichts allzu Kompliziertes.“

„Bitte beachten Sie, dass nur die Variable unveränderlich wird, nicht aber ein Objekt, auf das sie verweist. Das Objekt kann weiterhin geändert werden.“

„Das wollte ich eigentlich gerade fragen. Und es gibt keine Möglichkeit, das Objekt unveränderlich zu machen?“

„Nein, es sei denn, Sie schreiben eine unveränderliche Klasse.“

„Bitte beachten Sie, dass Sie den Anfangswert sofort zuweisen müssen, da der Wert einer endgültigen Variablen nicht geändert werden kann.“

Dieser Code wird kompiliert Dieser Code lässt sich nicht kompilieren
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

„Allerdings können Sie mit Java die Initialisierung der endgültigen Variablen einer Klasse bis zum Konstruktor verzögern.“

Dieser Code wird kompiliert Dieser Code lässt sich nicht kompilieren
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

„Außerdem können verschiedene Konstruktoren Endvariablen mit unterschiedlichen Werten initialisieren. Das ist sehr praktisch:“

Dieser Code wird kompiliert
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

„Das war ein wirklich interessantes Thema und absolut alles macht Sinn. Danke, Bilaabo!“