At­slēg­vārds final tiek izmantots Java, lai izveidotu elementus, kurus nevar mainīt. Šo mo­di­fi­ka­to­ru var piemērot klasēm, metodēm un mai­nī­ga­jiem. Tas tiek izmantots, lai novērstu kļūdas un apzinātu ļaun­prā­tī­gu iz­man­to­ša­nu kodā.

Kas ir Java final?

Lielākā daļa prog­ram­mē­ša­nas valodu ļauj esošo kodu modificēt un pa­pla­ši­nāt pēc va­ja­dzī­bas. Java valodā tas arī ir iespējams, bet ir gadījumi, kad ir ļoti svarīgi, lai elements tiktu atzīts par nemaināmu. Java valodā to var izdarīt, iz­man­to­jot final mo­di­fi­ka­to­ru. Šo mo­di­fi­ka­to­ru izmanto, lai ie­ro­be­žo­tu piekļuvi klasei, metodei vai mai­nī­ga­jam. Kad mainīgais ir deklarēts kā galīgs, tā vērtību nevar mainīt. Galīgo klasi nevar pa­pla­ši­nāt, un galīgo metodi nevar pār­rak­stīt. Tas palīdz aizsargāt pret šīs koda daļas ļaun­prā­tī­gu iz­man­to­ša­nu.

Pēdējās no­dar­bī­bas

Ja klasē iz­man­to­jat Java final, to vairs nevar pa­pla­ši­nāt. Šī pieeja ir ļoti izplatīta, un daudzos gadījumos to izmanto, lai novērstu ap­akš­kla­ses at­va­si­nā­ša­nu. Tas attiecas uz pamata datu tipiem, piemēram, java.lang.Math vai java.lang.String, kas vienmēr tiek deklarēti kā galīgi. Pat ja vēlaties novērst galvenās klases ap­akš­kla­ses at­va­si­nā­ša­nu citu iemeslu dēļ, vis­la­bā­kais veids ir izmantot Java final. Turp­mā­ka­jā piemērā mēs iz­vei­do­sim galīgo klasi un otro klasi, kurai teo­rē­tis­ki tā būtu jā­pap­la­ši­na. Pēc tam seko galvenā klase ar galveno metodi.

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

Rezultāts, ko saņemsiet, iz­ska­tī­sies aptuveni šādi:

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

Galīgās metodes

Ja metode tiek atzīmēta kā galīga, to nevar pār­rak­stīt. Tas nodrošina, ka ap­akš­kla­ses metode nevar mainīt tās paredzēto darbību. Lai to panāktu, metode jādeklarē ar Java final mo­di­fi­ka­to­ru. Piemēram, aplūkosim klasi ar nosaukumu „Emperor”, kurā ir galīgā metode „myTitle”. Cita klase „King”, kas paplašina „Emperor”, mēģina pār­rak­stīt metodi „myTitle”. Galvenajā metodē mēs iz­man­to­jam „Prince” instanci, lai piekļūtu metodei. Kods izskatās šādi:

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

Ja tagad pie­mē­ro­siet šo kodu, saņemsiet kļūdas ziņojumu:

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

Galīgie mainīgie

Java final tiek izmantots arī, lai izveidotu mainīgos ar vērtībām, kuras pēc tam nevar mainīt. Tas ir īpaši svarīgi, ja noteikti mainīgie kodā ir jāpatur nemainīgi. Turp­mā­ka­jā piemērā mēs iz­vei­do­sim mainīgo x, kuram ir vērtība 5. Pēc tam mēs mēģināsim ievietot šo mainīgo un piešķirt tam jaunu vērtību. Kods izskatās šādi:

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

Kad iz­man­to­jam Java komandu System.out.println, lai parādītu rezultātu, saņemam šādu kļūdas ziņojumu:

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

Iz­vei­do­jiet tukšas galīgās mainīgās

Java valodā mainīgie vienmēr ir jā­ini­cia­li­zē. Tomēr, ja dek­la­rē­jat tukšu galīgo mainīgo, to varat ini­cia­li­zēt ar klases kons­truk­to­ru. Šādi izskatās kods:

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

Ja iz­pil­dī­siet šo kodu, kā rezultātu saņemsiet šādu teikumu:

Here is your message.
java
Go to Main Menu