O mo­di­fi­ca­dor final é utilizado em Java para criar elementos que não podem ser mo­di­fi­ca­dos pos­te­ri­or­mente. Pode aplicar este mo­di­fi­ca­dor a classes, métodos e variáveis. É utilizado prin­ci­pal­mente para evitar erros e uti­li­za­ções indevidas in­ten­ci­o­nais dentro do código.

O que é Java final?

A maioria das lin­gua­gens de pro­gra­ma­ção oferece a pos­si­bi­li­dade de modificar e ampliar o código existente de acordo com as ne­ces­si­da­des. Embora, em princípio, isso também seja possível em Java, às vezes pode ser im­por­tante que um elemento seja ar­ma­ze­nado como imutável. O mo­di­fi­ca­dor cor­res­pon­dente é de­no­mi­nado final em Java. Pode ser utilizado para res­trin­gir o acesso a uma classe, um método ou uma variável. Com ele, o valor de uma variável final já não pode ser alterado, as extensões para uma classe final não são possíveis e um método final não pode ser suspenso. Desta forma, evita-se o uso indevido da secção de código cor­res­pon­dente.

Aulas finais

Se utilizar o mo­di­fi­ca­dor final do Java para uma classe, esta já não poderá ser estendida. Esta abordagem é muito comum, pois em muitos casos pode ser útil para evitar a derivação de uma subclasse. Isto aplica-se par­ti­cu­lar­mente a tipos de dados básicos como java.lang.Math ou java.lang.String, que são sempre de­cla­ra­dos como finais. Mesmo que queira evitar que sub­clas­ses sejam derivadas de uma classe principal por outras razões, o mo­di­fi­ca­dor final é a melhor maneira. No exemplo a seguir, criamos uma classe final e uma segunda classe que, te­o­ri­ca­mente, deveria estendê-la. A classe principal com o método main vem em terceiro lugar:

final class ClaseFinal { 
public void metodoejemplo() { 
System.out.println("Este es un método dentro de la clase final."); 
} 
} 
class OtraClase extends ClaseFinal { 
public void metodoejemplo() { 
System.out.println("Este método está en la otra clase."); 
} 
} 
public class Main { 
public static void main(String[] args) { 
OtraClase NuestraOtraClase = new OtraClase(); 
NuestraOtraClase.metodoejemplo(); 
} 
}
java

O resultado deve ser algo assim:

Main.java:6: error: cannot inherit from final ClaseFinal 
class OtraClase extends ClaseFinal 
    ^ 
1 error
java

Métodos finais

Se marcar um método como final, ele não poderá ser so­bres­crito. Entre outras coisas, isso evita que um método de uma classe su­bor­di­nada receba um sig­ni­fi­cado diferente. Se quiser evitar isso, crie um método final com o mo­di­fi­ca­dor final do Java. Por exemplo, criamos uma classe chamada «Imperador» que contém um método final chamado «meuTítulo». A classe seguinte, «Rei», estende «Imperador» e tenta so­bres­cre­ver o método «meuTítulo». Para o método principal, usamos «Príncipe» e tentamos aceder ao método. O código ficaria assim:

public class Emperador { 
public final void miTitulo() { 
System.out.println("Soy el emperador."); 
} 
} 
public class Rey extends Emperador { 
public final void miTitulo() { 
System.out.println("Soy el rey."); 
} 
} 
public class Principe { 
public static void main(String[] args) { 
Rey miTitulo = new Rey(); 
Rey.miTitulo(); 
} 
}
java

Se aplicar este código, receberá uma mensagem de erro:

Main.java:9: error miTitulo() in Rey cannot override miTitulo() in Emperador public final void miTitulo() { 
^ 
overriden method is final
java

Variáveis finais

O mo­di­fi­ca­dor final também é usado para criar variáveis de forma que o seu valor não possa ser mo­di­fi­cado pos­te­ri­or­mente. Isso é muito im­por­tante se de­ter­mi­na­das variáveis devem per­ma­ne­cer sempre cons­tan­tes dentro do código. No exemplo a seguir, criamos uma variável x que tem o valor 5. Em seguida, tentamos in­cor­po­rar essa variável e atribuir-lhe um novo valor. O código ficará assim:

public class Main { 
final int x = 5; 
 
public static void main(String[] args) { 
Main nuevoValor = new Main(); 
nuevoValor.x = 10; 
System.out.println(nuevoValor.x); 
} 
}
java

Se agora uti­li­zar­mos o comando Java System.out.println para mostrar o resultado, re­ce­be­re­mos a seguinte mensagem de erro:

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

Criar variáveis finais vazias

Em Java, as variáveis devem sempre ser ini­ci­a­li­za­das. No entanto, se declarar uma variável final vazia, pode ini­ci­a­lizá-la com um cons­tru­tor de classe. No código, ficará assim:

public class Ejemplo { 
final String textodeejemplo; 
Ejemplo() { 
textodeejemplo = "Este es tu mensaje."; 
} 
public static void main(String[] args) { 
Ejemplo nuevoObjeto = new Ejemplo(); 
System.out.println(nuevoObjeto.textodeejemplo); 
} 
}
java

Se executar este código, receberá a seguinte sentença como resultado:

Este es tu mensaje.
java
Ir para o menu principal