Märksõna final ka­su­ta­takse Java-s muu­tu­ma­tute ele­men­tide loomiseks. Seda mo­di­fi­kaa­to­rit saab rakendada klas­si­dele, mee­to­di­tele ja muu­tu­ja­tele. Eelkõige ka­su­ta­takse seda vea ja tahtliku väär­ka­su­tuse väl­ti­miseks koodis.

Mis on Java final?

Enamik prog­ram­mee­ri­mis­keeli võimaldab ole­mas­ole­vat koodi soovi korral muuta ja laiendada. Java keeles on see samuti võimalik, kuid on juhtumeid, kus on oluline, et element oleks määratud muu­tu­ma­tuks. Java keeles saab seda teha mo­di­fi­kaa­tori final abil. Seda mo­di­fi­kaa­to­rit ka­su­ta­takse klassi, meetodi või muutuja juur­de­pääsu pii­ra­miseks. Kui muutuja on dek­la­ree­ri­tud lõplikuks, ei saa selle väärtust muuta. Lõplikku klassi ei saa laiendada ja lõplikku meetodit ei saa ümber kirjutada. See aitab kaitsta koodi selle osa väär­ka­su­ta­mise eest.

Lõplikud tunnid

Kui kasutate klassi jaoks Java final, ei saa seda enam laiendada. See lä­he­ne­mis­viis on väga levinud ja paljudel juhtudel ka­su­ta­takse seda alam­klassi tu­le­ta­mise väl­ti­miseks. See kehtib põhiliste and­me­tüü­pide kohta, nagu java.lang.Math või java.lang.String, mis on alati dek­la­ree­ri­tud lõplikena. Isegi kui soovite muudel põhjustel vältida põ­hi­klassi alam­klas­side tu­le­ta­mist, on Java final ka­su­ta­mine parim viis. Järgmises näites loome lõpliku klassi ja teise klassi, mis peaks teo­ree­ti­li­selt seda laiendama. Pärast seda tuleb põhiklass koos põ­hi­mee­to­diga.

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

Saadud väljund peaks olema umbes selline:

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

Lõplikud meetodid

Kui mär­gis­tate meetodi lõplikuks, ei saa seda ümber kirjutada. See tagab, et alam­klassi meetod ei saa muuta oma ka­van­da­tud käitumist. Selle saa­vu­ta­miseks dek­la­ree­rige meetod Java final mo­di­fi­kaa­toriga. Võtame näiteks klassi nimega „Emperor”, mis sisaldab lõplikku meetodit nimega „myTitle”. Teine klass „King”, mis laiendab „Emperor”, üritab meetodit „myTitle” ümber kirjutada. Pea­mee­to­dis kasutame meetodile juur­de­pääs­uks „Prince” instantsi. Kood on järgmine:

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

Kui te nüüd seda koodi rakendate, saate veateate:

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

Lõplikud muutujad

Java final ka­su­ta­takse ka muutujate loomiseks, mille väärtusi ei saa hiljem muuta. See on eriti oluline, kui teatud muutujad peavad koodis jääma kons­tant­seks. Järgmises näites loome muutuja x, mille väärtus on 5. Seejärel proovime seda muutujat lisada ja määrata sellele uue väärtuse. Kood näeb välja järgmine:

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

Kui kasutame Java-käsku System.out.println tulemuse ku­va­miseks, saame järgmise veateate:

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

Loo tühjad lõplikud muutujad

Java-s tuleb muutujad alati init­sia­li­see­rida. Kui aga dek­la­ree­rite tühi lõpliku muutuja, saate selle init­sia­li­see­rida klassi konst­ruk­toriga. Kood näeb välja järgmine:

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

Kui te selle koodi käivitate, saate väl­jun­dina järgmise lause:

Here is your message.
java
Go to Main Menu