TutorJava Nivel Básico

Se puede declarar que una clase sea final; esto es, que la clase no pueda tener subclases. Existen (al menos) dos razones por las que se querr�a hacer esto: razones de seguridad y de dise�o.

Seguridad: Un mecanismo que los hackers utilizan para atacar sistemas es crear subclases de una clase y luego sustituirla por el original. Las subclases parecen y sienten como la clase original pero hacen cosas bastante diferentes, probablemente causando da�os u obteniendo informaci�n privada. Para prevenir esta clase de subversi�n, se puede declarar que la clase sea final y as� prevenir que se cree cualquier subclase.

La clase String del paquete java.lang es una clase final s�lo por esta raz�n. La clase String es tan vital para la operaci�n del compilador y del int�rprete que el sistema Java debe garantizar que siempre que un m�todo o un objeto utilicen un String, obtenga un objeto java.lang.String y no alg�n otro string. Esto asegura que ning�n string tendr� propiedades extra�as, incosistentes o indeseables.

Si se intenta compilar una subclase de una clase final, el compilador mostrar� un mensaje de error y no compilar� el programa. Adem�s, los bytescodes verifican que no est� teniendo lugar una subversi�n, al nivel de byte comprobando que una clase no es una subclase de una clase final.

Dise�o: Otra raz�n por la que se podr�a querer declarar una clase final son razones de dise�o orientado a objetos. Se podr�a pensar que una clase es "perfecta" o que, conceptualmente hablando, la clase no deber�a tener subclases.

Para especificar que una clase es una clase final, se utiliza la palabra clave final antes de la palabra clave class en la declaraci�n de la clase. Por ejemplo, si quisieramos declarar AlgoritmodeAjedrez como una clase final (perfecta), la declaraci�n se parecer�a a esto.

final class AlgoritmodeAjedrez {
    . . .
}

Cualquier intento posterior de crear una subclase de AlgoritmodeAjedrez resultar� en el siguiente error del compilador.

Chess.java:6: Can't subclass final classes: class AlgoritmodeAjedrez
class MejorAlgoritmodeAjedrez extends AlgoritmodeAjedrez {
      ^
1 error

.�M�todos Finales

Si la creacci�n de clases finales parece algo dura para nuestras necesidades, y realmente lo que se quiere es proteger son algunos m�todos de una clase para que no sean sobreescritos, se puede utilizar la palabra clave final en la declaraci�n de m�todo para indicar al compilador que este m�todo no puede ser sobreescrito por las subclases.

Se podr�a desear hacer que un m�todo fuera final si el m�todo tiene una implementaci�n que no debe ser cambiada y que es cr�tica para el estado consistente del objeto. Por ejemplo, en lugar de hacer AlgoritmodeAjedrez como una clase final, podr�amos hacer siguienteMovimiento() como un m�todo final.

class AlgoritmodeAjedrez {
    . . .
    final void siguienteMovimiento(Pieza piezaMovida,
			PosicionenTablero nuevaPosicion) {
    }
    . . .
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP