Dans une classe Java, une méthode peut être définie comme étant final
, pour marquer que cette méthode ne peut pas être remplacée:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
C'est clair, et cela peut être d'une certaine utilité pour se protéger contre un dépassement accidentel, ou peut-être des performances - mais ce n'est pas ma question.
Ma question est la suivante: d'un point de vue POO, j'ai compris qu'en définissant une méthode, final
le concepteur de classe promet que cette méthode fonctionnera toujours comme décrit ou sous-entendu. Mais souvent, cela peut être hors de l'influence de l'auteur de la classe, si ce que fait la méthode est plus compliqué, alors il suffit de fournir une propriété .
La contrainte syntaxique est claire pour moi, mais quelle est l'implication au sens de la POO? Est-il final
utilisé correctement dans ce sens par la plupart des auteurs de classe?
Quel genre de «contrat» une final
méthode promet-elle?
Tout d'abord, vous pouvez marquer des classes non abstraites
final
ainsi que des champs et des méthodes. De cette façon, toute la classe ne peut pas être sous-classée. Ainsi, le comportement de la classe sera corrigé.Je suis d'accord que les méthodes de marquage
final
ne garantissent pas que leur comportement sera le même dans les sous-classes si ces méthodes appellent des méthodes non finales. Si le comportement doit effectivement être corrigé, cela doit être réalisé par convention et conception soignée. Et n'oubliez pas de le comprendre dans javadoc! (Documentation java)Dernier point mais non le moindre, le
final
mot - clé a un rôle très important dans Java Memory Model (JMM). Il est garanti par JMM que pour obtenir la visibilité desfinal
champs, vous n'avez pas besoin d'une synchronisation appropriée. Par exemple:la source
String
, mais dans les classes définies par l'utilisateur). Mais ce que vous avez dit à propos du "final ne garantit pas le comportement" est exactement ce que je veux dire . Je suis d'accord, la doc et le design sont importants.final
n'assurera pas la visibilité des modifications apportées aux objets composés, tels queMap
.Je ne suis pas sûr que vous puissiez faire des affirmations sur l'utilisation de «final» et comment cela influe sur le contrat de conception global du logiciel. Vous êtes assuré qu'aucun développeur ne peut ignorer cette méthode et annuler son contrat de cette façon. Mais d'un autre côté, la méthode finale peut s'appuyer sur des variables de classe ou d'instance dont les valeurs sont définies par des sous-classes, et peut appeler d'autres méthodes de classe qui sont surchargées. La garantie finale est donc tout au plus très faible.
la source
const
. Comme danschar const * const = "Hello"
ouchar const * const addName(char const * const name) const
...Non, ce n'est pas en dehors de l'influence de l'auteur de la classe. Vous ne pouvez pas le remplacer dans votre classe dérivée, donc il fera ce que l'auteur de la classe de base a prévu.
http://download.oracle.com/javase/tutorial/java/IandI/final.html
Il convient de noter la partie où il suggère que les méthodes appelées à partir des constructeurs devraient être
final
.la source