
Foto por: b10lm, retocada por campusMVP (CC BY 2.0)
Aunque estas palabras clave no tienen nada que ver entre sí, dado que se parecen mucho, a veces puede resultar complicado para los principiantes saber para qué sirve cada una.
Para evitar que esto te ocurra y que puedas tener estar referencia a mano por si la necesitas, a continuación te hacemos un resumen de su utilidad con un ejemplo de uso de cada una:
final
La palabra clave final
se utiliza en programación orientada a objetos para aplicar restricciones a una clase, a un método o campo de una clase o a una variable.
En el caso de las clases "finales" no se pueden usar en herencia, por lo que no podrás crear clases derivadas de una clase marcada con final
.
En el caso de métodos o campos de clase, éstos no podrán ser sobrescritos en clases derivadas.
En C#, por ejemplo, el equivalente para estos dos casos sería sealed
.
Finalmente, si declaramos una variable como "final" solamente le podemos asignar un valor cuando la declaramos o en la primera asignación que le hagamos (es decir, es una manera de declarar constantes en Java).
En C# el equivalente sería const
o readonly
.
Ejemplo de clase "final":
public final class NoHeredable
{
.....
}
//El intento de declarar esta clase produce un error, ya que no se puede heredar de la anterior
public class IntentoHeredar extends NoHeredable
{
....
}
Ejemplo de método "final":
public class Base
{
public void metodo1() { ... }
public final void metodo2() { ... }
}
public class Derivada extends Base
{
public void metodo1() { .... } //Sin problema
public void metodo2() { .... } //Produce un error!
}
finalize
Cuando el recolector de basura de Java determina que ya no hay más referencias a un objeto y se dispone a destruirlo, llama al método java.lang.Object.finalize
de éste. Si la clase en cuestión ha declarado su propio método finalize
sobrescribiendo al de la clase Object
(todas las clases Java heredan de Object
), entonces el recolector de basura llama a este método de la clase en el objeto que va a destruir.
Esto es útil si nuestra clase hace uso de algún tipo de recurso del sistema que necesita ser liberado cuando no vaya a utilizarse más. En el método finalize
deberíamos encargarnos de liberar dichos recursos.
Es importante señalar que este método debe ser siempre de tipo "protegido" (protected
) para que solo pueda ser utilizado por las clases derivadas de la actual.
Ejemplo:
public class MiClase
{
protected void finalize()
{
... //Liberamos los recursos
}
}
En C# también existe Finalize
, pero también ofrece el método Dispose
y la interfaz IDisposable
cuando queremos ceder el control de esto al programador.
finally
Cuando gestionamos excepciones en Java con la estructura try-catch
ponemos el código a ejecutar en el bloque try
, y si se produce una excepción o error lo gestionamos en el catch
. Pero qué pasa si queremos ejecutar un código siempre, incluso aunque haya una excepción.
Esta es la labor de finally
. En ese bloque colocamos el código común que siempre debe ejecutarse al final, y nos despreocupamos:
MiClase clase1 = new MiClase(); //Del ejemplo anterior
try
{
//Hacemos algo con la clase
....
}
catch(Exception e)
{
System.out.println(e);
}
finally
{
//nos aseguramos de que pase lo que pase, la clase libera los recursos
clase1.finalize();
}
Esta parte de la estructura try-catch-finally
nos evita tener que repetir erl mismo código una y otra vez tanto en el try
como en cada uno de los catch
, que sería lo que deberíamos hacer si no existiera.
En C# existe exactamente la misma estructura.
¡Espero que te sea útil!