Het sleu­tel­woord final wordt in Java gebruikt om elementen te creëren die niet kunnen worden gewijzigd. Je kunt deze modifier toepassen op klassen, methoden en va­ri­a­be­len. Het wordt met name gebruikt om fouten en op­zet­te­lijk misbruik binnen de code te voorkomen.

Wat is Java final?

In de meeste pro­gram­meer­ta­len kan bestaande code naar wens worden gewijzigd en uit­ge­breid. In Java is dit ook mogelijk, maar er zijn gevallen waarin het cruciaal is dat een element als on­ver­an­der­lijk wordt aan­ge­merkt. In Java kunt u dit doen met behulp van de final. Deze mo­di­fi­ca­tor wordt gebruikt om de toegang tot een klasse, een methode of een variabele te beperken. Zodra een variabele als de­fi­ni­tief is aan­ge­merkt, kan de waarde ervan niet meer worden gewijzigd. Een final-klasse kan niet worden uit­ge­breid en een final-methode kan niet worden over­schre­ven. Dit helpt om misbruik van dat deel van de code te voorkomen.

Laatste lessen

Als u Java final voor een klasse gebruikt, kan deze niet meer worden uit­ge­breid. Deze aanpak is heel ge­brui­ke­lijk en wordt in veel gevallen gebruikt om het afleiden van een subklasse te voorkomen. Dit geldt voor ba­sis­ge­ge­vens­ty­pen zoals java.lang.Math of java.lang.String, die altijd als de­fi­ni­tief worden ge­de­cla­reerd. Zelfs als u om andere redenen wilt voorkomen dat sub­klas­sen van een hoofd­klas­se worden afgeleid, is het gebruik van Java final de beste manier. In het volgende voorbeeld maken we een de­fi­ni­tie­ve klasse en een tweede klasse die deze in theorie zou moeten uit­brei­den. Daarna komt de hoofd­klas­se met de hoofd­me­tho­de.

final class FinalClass {
	public void exampleMethod() {
		System.out.println("This is a method within the final class.");
	}
}
class AdditionalClass extends FinalClass {
	public void exampleMethod() {
		System.out.println("The method is now also available in the additional class.");
	}
}
public class Main {
	public static void main(String[] args) {
		AdditionalClass ourAdditionalClass = new AdditionalClass();
		ourAdditionalClass.exampleMethod();
	}
}
java

De uitvoer die u ontvangt, zou er ongeveer zo uit moeten zien:

Main.java:6: error: cannot inherit from final FinalClass
class AdditionalClass extends FinalClass
       ^
1 error
java

De­fi­ni­tie­ve methoden

Als u een methode als de­fi­ni­tief markeert, kan deze niet worden over­schre­ven. Dit zorgt ervoor dat een methode in een subklasse het beoogde gedrag niet kan wijzigen. Om dit te bereiken, de­cla­reert u de methode met de final. Neem bij­voor­beeld een klasse met de naam ‘Emperor’ die een de­fi­ni­tie­ve methode met de naam ‘myTitle’ bevat. Een andere klasse, ‘King’, die ‘Emperor’ uitbreidt, probeert de methode ‘myTitle’ te over­schrij­ven. In de hoofd­me­tho­de gebruiken we een instantie van ‘Prince’ om toegang te krijgen tot de methode. De code ziet er als volgt uit:

public class Emperor {
	public final void myTitle() {
		System.out.println("I am the emperor.");
	}
}
public class King extends Emperor {
	public final void myTitle() {
		System.out.println("I am the king.");
	}
}
public class Prince {
	public static void main(String[] args) {
		King myTitle = new King();
		King.myTitle();
	}
}
java

Als u deze code nu toepast, krijgt u een fout­mel­ding:

Main.java:9: error myTitle() in King cannot override myTitle() in Emperor public final void myTitle() {
		^
overridden method is final
java

Eind­va­ri­a­be­len

Java final wordt ook gebruikt om va­ri­a­be­len te maken met waarden die achteraf niet meer kunnen worden gewijzigd. Dit is vooral be­lang­rijk als bepaalde va­ri­a­be­len constant moeten blijven binnen de code. In het volgende voorbeeld maken we de variabele x aan, die de waarde 5 heeft. Ver­vol­gens proberen we deze variabele in te voegen en er een nieuwe waarde aan toe te kennen. De code ziet er als volgt uit:

public class Main {
	final int x = 5;
public static void main(String[] args) {
	Main newValue = new Main();
	newValue.x = 10;
	System.out.println(newValue.x);
	}
}
java

Wanneer we het Java-commando System.out.println gebruiken om het resultaat weer te geven, krijgen we de volgende fout­mel­ding:

Main.java:6: error: cannot assign a value to final variable x
	newValue.x = 10;
		     ^
1 error
java

Maak lege eind­va­ri­a­be­len aan

Va­ri­a­be­len moeten altijd worden ge­ï­ni­ti­a­li­seerd in Java. Als u echter een lege de­fi­ni­tie­ve variabele de­cla­reert, kunt u deze ini­ti­a­li­se­ren met een klas­se­con­struc­tor. Dit is hoe de code eruitziet:

public class Example {
	final String exampleText;
	Example() {
		exampleText = "Here is your message.";
	}
	public static void main(String[] args) {
		Example newObject = new Example();
		System.out.println(newObject.exampleText);
	}
}
java

Als je deze code uitvoert, krijg je de volgende zin als uitvoer:

Here is your message.
java
Ga naar hoofdmenu