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, final
el 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 final
usa correctamente en este sentido por la mayoría de los autores de clase?
¿Qué tipo de "contrato" final
promete 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
final
no 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
final
palabra clave tiene un papel muy importante en Java Memory Model (JMM). JMM garantiza que para lograr la visibilidad de losfinal
campos 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.final
no 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