La palabra clave final se emplea en distintos contextos. En primer lugar, final, es un modificador de no acceso que sólo se puede aplicar a una variable, un método o una clase.
Las variables finales solo se usan en aquellos valores que sabemos de antemano que no van a variar, o sea, que permanecerán constantes durante la ejecución del programa.
Cuando una variable se declara empleando la palabra clave final, su valor no puede ser modificado. Esto también significa que se debe inicializar.
Es una buena práctica representar las variables finales en mayúsculas, utilizando guiones bajos para separar las palabras como puede verse en el siguiente ejemplo:
final int LIMITE=5;
final int LIMITE;
static final double PI = 3.141592653589793;
Es vital inicializar una variable final, debido a que el compilador emitirá un error al realizar la compilación. Las variables finales solo se pueden inicializar una vez, ya sea por medio de un inicializador o bien una declaración de asignación.
Cabe destacar que existen tres formas de inicializar una variable final:
En este ejemplo se pueden ver las formas de inicializar una variable final:
// Programa Java para demostrar diferentes formas
// de inicializar una variable final
class JDC
{
// una variable final
// inicialización directa
final int LIMITE = 5;
// una variable final en blanco
final int CAPACIDAD;
// otra variable final en blanco
final int MINIMO;
// una variable static final PI
// inicialización directa
static final double PI = 3.141592653589793;
// una variable static final en blanco
static final double CONSTANTEEULER;
// bloque inicializador de instancias
// para inicializar CAPACIDAD
{
CAPACIDAD = 25;
}
// bloque inicializador static
// para inicializar CONSTANTEEULER
static{
CONSTANTEEULER = 2.3;
}
// consctructor para inicializar MINIMO
// Tenga en cuenta que si hay más de un constructor,
// debe inicializar MINIMO en ellos también
public JDC()
{
MINIMO = -1;
}
}
La variable final que sea una referencia a un objeto, se denomina variable final de referencia. A continuación en el ejemplo la variable final de StringBuffer se parece a:
final StringBuffer cadena;
Una variable final no se puede reasignar. Pero en el caso de una variable final de referencia, se puede modificar el estado interno del objeto indicado por esa variable de referencia. Esta propiedad de final se conoce como no-transitividad.
En el siguiente ejemplo se puede observar la declaración de una variable final de referencia y el cambio de estado interno.
//Programa Java para demostrar
// la variable final de referencia
class JDC {
public static void main(String[] args) {
//una variable final de referencia
final StringBuilder cadena=new StringBuilder("Java");
System.out.println(cadena);
//cambiando estado interno de referencia del objeto
//por variable de referencia final 'cadena'
cadena.append("desdeCero");
System.out.println(cadena);
}
}
Salida:
Java
JavadesdeCero
La propiedad no-transitividad se aplica también a las matrices, esto se debe a que en Java, las matrices son objetos. Las matrices que tienen la palabra clave final también se denominan matrices finales.