Nøg­le­or­det final bruges i Java til at oprette elementer, der ikke kan ændres. Du kan anvende denne mo­di­fi­ka­tor på klasser, metoder og variabler. Den bruges især til at forhindre fejl og bevidst misbrug i koden.

Hvad er Java final?

De fleste pro­gram­me­rings­sprog tillader, at ek­si­ste­ren­de kode ændres og udvides efter ønske. I Java er dette også muligt, men der er tilfælde, hvor det er afgørende, at et element udpeges som uændeligt. I Java kan du gøre dette ved hjælp af mo­di­fi­ka­to­ren final. Denne mo­di­fi­ka­tor bruges til at begrænse adgangen til en klasse, en metode eller en variabel. Når en variabel er erklæret som endelig, kan dens værdi ikke ændres. En final klasse kan ikke udvides, og en final metode kan ikke over­skri­ves. Dette hjælper med at beskytte mod misbrug af den på­gæl­den­de del af koden.

Af­slut­ten­de un­der­vis­ning

Hvis du bruger Java final til en klasse, kan den ikke længere udvides. Denne tilgang er meget al­min­de­lig og bruges i mange tilfælde til at forhindre afledning af en un­der­klas­se. Dette gælder for grund­læg­gen­de datatyper som java.lang.Math eller java.lang.String, der altid erklæres som endelige. Selv hvis du af andre årsager ønsker at forhindre, at un­der­klas­ser af en ho­ved­klas­se afledes, er det bedst at bruge Java final. I det følgende eksempel opretter vi en endelig klasse og en anden klasse, der teoretisk set skal udvide den. Derefter kommer ho­ved­klas­sen med ho­ved­me­to­den.

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

Det resultat, du får, bør se no­gen­lun­de sådan ud:

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

Endelige metoder

Hvis du markerer en metode som endelig, kan den ikke over­skri­ves. Dette sikrer, at en metode i en un­der­klas­se ikke kan ændre sin til­sig­te­de adfærd. For at opnå dette skal du deklarere metoden med final -mo­di­fi­ka­to­ren. Betragt for eksempel en klasse ved navn ‘Emperor’, der in­de­hol­der en endelig metode kaldet ‘myTitle’. En anden klasse, ‘King’, der udvider ‘Emperor’, forsøger at over­skri­ve metoden ‘myTitle’. I ho­ved­me­to­den bruger vi en instans af ‘Prince’ til at få adgang til metoden. Koden ser således ud:

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

Hvis du nu anvender denne kode, vil du modtage en fejl­med­del­el­se:

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

Endelige variabler

Java final bruges også til at oprette variabler med værdier, der ikke kan ændres ef­ter­føl­gen­de. Dette er især vigtigt, hvis visse variabler skal forblive konstante i koden. I det følgende eksempel opretter vi variablen x, som har værdien 5. Derefter forsøger vi at indsætte denne variabel og tildele den en ny værdi. Koden ser således ud:

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

Når vi bruger Java-kom­man­do­en System.out.println til at vise re­sul­ta­tet, får vi følgende fejl­med­del­el­se:

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

Opret tomme endelige variabler

Variabler skal altid ini­ti­a­li­se­res i Java. Hvis du imid­ler­tid de­kla­re­rer en tom endelig variabel, kan du ini­ti­a­li­se­re den med en klas­se­kon­struk­tør. Sådan ser koden ud:

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

Hvis du udfører denne kode, får du følgende sætning som output:

Here is your message.
java
Gå til ho­ved­me­nu­en