En una clase Java, se puede definir un método para que sea final, para marcar que este método no se puede anular:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
Eso está claro, y puede ser útil para proteger contra la anulación accidental, o tal vez el rendimiento, pero esa no es mi pregunta.
Mi pregunta es: desde el punto de vista de OOP, entendí que, al definir un método, finalel diseñador de la clase promete que este método siempre funcionará según lo descrito o implícito. Pero a menudo esto puede estar fuera de la influencia del autor de la clase, si lo que está haciendo el método es más complicado que simplemente entregar una propiedad .
La restricción sintáctica es clara para mí, pero ¿cuál es la implicación en el sentido OOP? ¿Se finalusa correctamente en este sentido por la mayoría de los autores de clase?
¿Qué tipo de "contrato" finalpromete un método?

En primer lugar, puede marcar clases no abstractas
final, así como campos y métodos. De esta manera, toda la clase no se puede subclasificar. Entonces, el comportamiento de la clase será arreglado.Estoy de acuerdo en que los métodos de marcado
finalno garantizan que su comportamiento sea el mismo en las subclases si estos métodos están llamando a métodos no finales. Si es necesario corregir el comportamiento, esto debe lograrse por convención y por un diseño cuidadoso. ¡Y no olvides mencionar esto en javadoc! (Documentación de java)Por último, pero no menos importante, la
finalpalabra clave tiene un papel muy importante en Java Memory Model (JMM). JMM garantiza que para lograr la visibilidad de losfinalcampos no necesita una sincronización adecuada. P.ej:fuente
String, sino en clases definidas por el usuario). Pero lo que usted dijo sobre "final no garantiza el comportamiento" es exactamente mi punto. Estoy de acuerdo, el documento y el diseño son importantes.finalno va a asegurar la visibilidad de los cambios realizados en los objetos compuestos, tales comoMap.No estoy seguro de que pueda hacer ninguna afirmación sobre el uso de "final" y cómo eso afecta el contrato de diseño general del software. Le garantizamos que ningún desarrollador puede anular este método y anular su contrato de esa manera. Pero, por otro lado, el método final puede basarse en variables de clase o instancia cuyos valores se establecen mediante subclases, y puede llamar a otros métodos de clase que se anulan. Por lo tanto, la final es, como mucho, una garantía muy débil.
fuente
const. Como enchar const * const = "Hello"ochar const * const addName(char const * const name) const...No, no está fuera de la influencia del autor de la clase. No puede anularlo en su clase derivada, por lo tanto, hará lo que el autor de la clase base pretendía.
http://download.oracle.com/javase/tutorial/java/IandI/final.html
Vale la pena señalar que es la parte donde sugiere que los métodos llamados desde los constructores deberían ser
final.fuente