Avain­sa­naa final käytetään Java-kielessä luomaan ele­ment­te­jä, joita ei voi muuttaa. Tätä muok­kaa­jaa voi käyttää luokkiin, me­ne­tel­miin ja muut­tu­jiin. Sitä käytetään eri­tyi­ses­ti estämään virheitä ja ta­hal­lis­ta vää­rin­käyt­töä koodissa.

Mikä on Java final?

Useimmat oh­jel­moin­ti­kie­let sallivat olemassa olevan koodin muok­kaa­mi­sen ja laa­jen­ta­mi­sen halutulla tavalla. Java-kielessä tämä on myös mah­dol­lis­ta, mutta joissakin ta­pauk­sis­sa on tärkeää, että elementti mää­ri­te­tään muut­tu­mat­to­mak­si. Java-kielessä tämä voidaan tehdä käyt­tä­mäl­lä final. Tätä mo­di­fi­kaat­to­ria käytetään ra­joit­ta­maan pääsyä luokkaan, metodiin tai muut­tu­jaan. Kun muuttuja on mää­ri­tet­ty lo­pul­li­sek­si, sen arvoa ei voi muuttaa. Final-luokkaa ei voi laajentaa, eikä final-metodia voi ohittaa. Tämä auttaa suo­jau­tu­maan kyseisen koodiosan vää­rin­käy­töl­tä.

Lo­pul­li­set luokat

Jos käytät Java final luokalle, sitä ei voi enää laajentaa. Tämä lä­hes­ty­mis­ta­pa on hyvin yleinen, ja monissa ta­pauk­sis­sa sitä käytetään estämään alaluokan johdanto. Tämä koskee pe­rus­da­ta­tyyp­pe­jä, kuten java.lang.Math tai java.lang.String, jotka on aina mää­ri­tel­ty lo­pul­li­sik­si. Vaikka haluat estää pääluokan ala­luok­kien johdannon muista syistä, Java final käyttö on paras tapa. Seu­raa­vas­sa esi­mer­kis­sä luomme lo­pul­li­sen luokan ja toisen luokan, jonka pitäisi teoriassa laajentaa sitä. Sen jälkeen tulee pääluokka pää­me­ne­tel­mäl­lä.

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

Tulostus näyttää suun­nil­leen tältä:

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

Lo­pul­li­set me­ne­tel­mät

Jos merkitset me­ne­tel­män lo­pul­li­sek­si, sitä ei voi ohittaa. Tämä varmistaa, että alaluokan menetelmä ei voi muuttaa sen tar­koi­tet­tua käyt­täy­ty­mis­tä. Saa­vut­taak­se­si tämän, ilmoita menetelmä Java final -muok­kai­mel­la. Otetaan esi­mer­kik­si luokka nimeltä “Emperor”, joka sisältää lo­pul­li­sen me­ne­tel­män nimeltä “myTitle”. Toinen luokka, “King”, joka laajentaa luokkaa “Emperor”, yrittää ohittaa me­ne­tel­män “myTitle”. Pää­me­ne­tel­mäs­sä käytämme ins­tans­sia “Prince” pääs­tääk­sem­me käsiksi me­ne­tel­mään. Koodi näyttää seu­raa­val­ta:

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

Jos käytät tätä koodia nyt, saat vir­heil­moi­tuk­sen:

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

Lo­pul­li­set muuttujat

Java final käytetään myös luomaan muuttujia, joiden arvoja ei voi myöhemmin muuttaa. Tämä on erityisen tärkeää, jos tietyt muuttujat on pidettävä vakioina koodissa. Seu­raa­vas­sa esi­mer­kis­sä luomme muuttujan x, jonka arvo on 5. Yritämme sitten lisätä tämän muuttujan ja määrittää sille uuden arvon. Koodi näyttää tältä:

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

Kun käytämme Java-komentoa System.out.println tuloksen näyt­tä­mi­seen, saamme seuraavan vir­heil­moi­tuk­sen:

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

Luo tyhjät lo­pul­li­set muuttujat

Muuttujat on aina alus­tet­ta­va Java-kielessä. Jos kuitenkin määrität tyhjän lo­pul­li­sen muuttujan, voit alustaa sen luok­ka­kon­struk­to­ril­la. Koodi näyttää seu­raa­val­ta:

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

Jos suoritat tämän koodin, saat seuraavan lauseen tu­los­tee­na:

Here is your message.
java
Siirry pää­va­lik­koon