¿Cuándo debería usar “final”?

¿Hay alguna razón particular por la que deba declarar una clase o un método final en la progtwigción cotidiana (web o no)? Proporcione un ejemplo del mundo real donde debería ser utilizado.

Por cierto, estoy preguntando porque estoy tratando de elegir una palabra clave ‘oscura’ y dominarla .

Impide que otros progtwigdores hagan cosas con tus clases que no pretendas que hagan. Entonces, en lugar de hacer un comentario que diga “no use esta clase para hacer XXX”, puede diseñarlo de tal forma que no tenga la tentación de anularlo y abusar de esa manera.

Editar : como se solicita un ejemplo, describiré un caso en el que puede encontrar esta palabra clave a mano … digamos que tiene una clase que define cómo dos objetos pueden comunicarse entre sí, por ejemplo, un oyente y un notificador. La clase de oyente obviamente debe permitir la herencia, pero es posible que desee hacer que la clase de notificador sea definitiva para que se use en una relación “tiene-a”. De esta forma, puede hacer algunas suposiciones a partir de sus objetos oyentes sobre la naturaleza de los mensajes que están recibiendo.

De lo contrario, sería posible heredar de esa clase, hacer todo tipo de cosas locas como extender los mensajes, etc. Si no quieres que otros progtwigdores lo hagan, entonces podrías hacer que la clase sea definitiva. Además, esto podría tener mucho más sentido en una API pública ampliamente utilizada, ya que también permite que otros progtwigdores entiendan fácilmente qué clases son adecuadas para la subclase.

Otro ejemplo: supongamos que tiene un procesador de flujo basado en un buffer, y dentro de su método de lectura () / write (), usted mantiene algunos datos sobre el estado actual de su objeto (es decir, el byte actual o lo que sea). No hay forma de garantizar que cualquier subclasificación de esta clase invoque los métodos de la súper durante el procesamiento, y dado que dicha clase probablemente solo contenga algunos métodos, es mejor hacer que todo sea definitivo en lugar de cada método. De nuevo, esto obliga a las personas que usan la clase a “tener-a”, no “es-a”, y por lo tanto, puede controlar cómo espera que se ejecute el código.

Estoy de acuerdo contigo en que hacer una final de clase entera es probablemente algo que tendrías que hacer una vez en una luna azul, pero es bueno que PHP tenga esta capacidad si decides ejercitarla.

“Hacer cumplir la composición sobre la herencia” lo expresa de manera bastante sucinta. Usted garantiza un cierto comportamiento de su clase que nada más puede interferir, que, como se explica en la siguiente sección, también puede tener beneficios de seguridad.

Algunas personas afirman que debes declarar que todas las clases son definitivas, a menos que específicamente pretendas permitirlas, y hayas examinado las implicaciones de la extensión polimórfica de las mismas. Tiendo a sentir que esto implica mucha desconfianza en quienquiera que esté trabajando con su código, pero desafortunadamente, a veces eso está justificado.

En muchos idiomas, declarar una clase como definitiva también proporciona beneficios de optimización, ya que no necesita ver los métodos de la tabla virt.

Si quiere hacer cumplir la intención de la clase, y la intención es tal que no tiene sentido crear una subclase, use la final; de lo contrario, no hay una ventaja significativa.

En general, es solo un mecanismo para hacer cumplir la intención.

Una clase final es una clase que no se puede subclasificar, por lo que cualquier cosa de la que no desee crear derivadas. Por ejemplo, en Java, la clase de Matemáticas es definitiva, ya que Java no quiere que puedas redefinir qué significa el valor Absoluto.

final (y sellado en c #) podría ser utilizado (por los diseñadores de la biblioteca de la clase) para imponer el comportamiento básico de una clase.
Por ejemplo, hacer cumplir que la cadena tiene un comportamiento inmutable
La clase de cadena en java está marcada como final y en c # está marcada como sellada.
Todas las cadenas son inmutables y ese comportamiento no se puede cambiar.