Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=7825fb44-fbf3-4b0f-b1f7-4aee5ebfc1d6

¿Cuál es la diferencia entre final, finalize y finally en Java? (y sus equivalentes en C#)


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.

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!

Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: Lenguajes y plataformas

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.