La palabra clave final (1)
¡Que tal! desgraciadamente tengo abandonado este espacio por muchas razones que creo no tiene caso mencionar, pero hoy decidi agregar esta entrada donde pretendo mostrar lo que aprendi de este tema del libro que ando leyendo. Espero no decir cosas fuera de la realidad.
La palabra clave final
Se emplea final para impedir cambios tanto para elementos de datos, métodos y clases. Se puede querer evitar cambios debido a nuestro diseño o la búsqueda de eficiencia.
Datos final
En los datos se pueden tener constantes de tiempo de compilación (valor que definimos de antemano y nunca va a cambiar) y de tiempo de ejecución (valor calculado). Estos tipos de constantes deben ser de tipos primitivos que se definen con la palabra final al momento de definirlos, hacerlo implica indicar su valor. Si se antepone la palabra static a final lo que sucedería es que el valor constante existirá en un único espacio de almacenamiento que no se podrá cambiar.
Usar final en referencias a objetos hace que sean constantes las referencias no los objetos. No se podrá hacer que la referencia apunte a otro objeto, pero el objeto si podrá modificarse.Lo mismo sucede con las matrices pues también son objetos.
Un ejemplo que nos propone Bruce Eckel es el siguiente, donde se describe el comportamiento de los elementos de datos de una clase utilizando final y static:
//: reusing/FinalData.java
//Efecto de final sobre los campos.
import java.util.*;
import static access.net.mindview.util.Print.*;
class Value {
int i; // Acceso de paquete
public Value(int i) { this.i = i; }
}
public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id) { this.id = id; }
// Pueden ser constantes de compilación:
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
// Constante pública típica:
public static final int VALUE_THREE = 39;
// No pueden ser constantes de tiempo de compilación:
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
// Matrices:
private final int[] a = { 1, 2, 3, 4, 5, 6 };
public String toString() {
return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5 + " a[0] = " + a[0] ;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
//! fd1.valueOne++; //Error: no se puede modificar el valor
fd1.v2.i++; // EL objeto no es constante
fd1.v1 = new Value(9); // Ok -- no es final
for(int i = 0; i < fd1.a.length; i++)
fd1.a[i]++; // ¡El objeto no es constante!
//! fd1.v2 = new Value(0); // Error: no se puede cambiar la referencia
//! fd1.VAL_3 = new Value(1);
//! fd1.a = new int[3];
print(fd1);
print("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
print(fd1);
print(fd2);
}
}
Espero pronto agregar otros temas que vaya viendo, ¡hasta pronto!

Comentarios recientes