Ključna beseda final se v Javi uporablja za ustvar­ja­nje elementov, ki jih ni mogoče spre­me­ni­ti. Ta mo­di­fi­ca­tor lahko uporabite za razrede, metode in spre­men­ljiv­ke. Uporablja se zlasti za pre­pre­če­va­nje napak in namerne zlorabe v kodi.

Kaj je Java final?

Večina pro­gram­skih jezikov omogoča spre­mi­nja­nje in raz­šir­ja­nje obstoječe kode po želji. V Javi je to prav tako mogoče, vendar obstajajo primeri, ko je ključnega pomena, da je element označen kot ne­spre­men­ljiv. V Javi lahko to storite z uporabo mo­di­fi­ka­tor­ja final. Ta mo­di­fi­ka­tor se uporablja za omejitev dostopa do razreda, metode ali spre­men­ljiv­ke. Ko je spre­men­ljiv­ka de­kla­ri­ra­na kot končna, njene vrednosti ni mogoče spre­me­ni­ti. Končnega razreda ni mogoče razširiti, končne metode pa ni mogoče prepisati. To pomaga zaščititi pred zlorabo tega dela kode.

Zadnje ure

Če za razred upo­ra­blja­te Java final, ga ni več mogoče razširiti. Ta pristop je zelo pogost in se v mnogih primerih uporablja za pre­pre­če­va­nje izpeljave po­d­ra­zre­da. To velja za osnovne po­dat­kov­ne tipe, kot sta java.lang.Math ali java.lang.String, ki so vedno de­kla­ri­ra­ni kot končni. Tudi če želite iz drugih razlogov pre­pre­či­ti izpeljavo po­d­ra­zre­dov glavnega razreda, je najboljša rešitev uporaba Java final. V na­sle­dnjem primeru bomo ustvarili končni razred in drugi razred, ki naj bi ga te­o­re­tič­no razširil. Nato sledi glavni razred z glavno metodo.

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

Rezultat, ki ga boste prejeli, naj bi bil podoben temu:

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

Končne metode

Če metodo označite kot končno, je ni mogoče prepisati. S tem se zagotovi, da metoda v po­d­ra­zre­du ne more spre­me­ni­ti svojega na­me­ra­va­ne­ga delovanja. Da bi to dosegli, metodo de­kla­ri­ra­te z mo­di­fi­ca­tor­jem Java final. Vzemite na primer razred z imenom »Emperor«, ki vključuje končno metodo z imenom »myTitle«. Druga razreda, »King«, ki razširja »Emperor«, poskuša prepisati metodo »myTitle«. V glavni metodi uporabimo primer »Prince« za dostop do metode. Koda je naslednja:

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

Če zdaj uporabite ta kod, boste prejeli sporočilo o napaki:

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

Končne spre­men­ljiv­ke

Java final se uporablja tudi za ustvar­ja­nje spre­men­ljivk z vre­dnost­mi, ki jih kasneje ni mogoče spre­me­ni­ti. To je še posebej pomembno, če morajo nekatere spre­men­ljiv­ke v kodi ostati ne­spre­me­nje­ne. V na­sle­dnjem primeru bomo ustvarili spre­men­ljiv­ko x, ki ima vrednost 5. Nato bomo poskusili vstaviti to spre­men­ljiv­ko in ji dodeliti novo vrednost. Koda je videti takole:

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

Ko uporabimo ukaz Java System.out.println za prikaz rezultata, prejmemo naslednje sporočilo o napaki:

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

Ustvari prazne končne spre­men­ljiv­ke

Spre­men­ljiv­ke morajo biti v Javi vedno ini­ci­a­li­zi­ra­ne. Če pa de­kla­ri­ra­mo prazno končno spre­men­ljiv­ko, jo lahko ini­ci­a­li­zi­ra­mo s kon­struk­tor­jem razreda. Tako izgleda koda:

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

Če izvedete ta kod, boste kot izhod prejeli naslednji stavek:

Here is your message.
java
Go to Main Menu