OVH Cloud OVH Cloud

Final et classe definie dans une fonction

1 réponse
Avatar
matlerouge
Bonjour

Voici un petit bout de code :

...
public void droite(final double a)
{
classe Droite extend foo
{
public void execute { (droite(a) };
}
programme.add(new Droite());
}
...


On me dit qu'il est obligatoire que l'argument de 'droite' contienne le
modificateur 'final'. Apparement cela est necessaire quand on definit
une classe dans une fonction. Je ne comprend pas tres bien pourquoi,
pouvez vous m'eclairer ?

Merci d'avance

1 réponse

Avatar
TestMan
Bonsoir,

Version longue :

Il est nécessaire pour étendre sa portée "implicitement".

Par défaut toute les références d'une méthode sont uniquement
disponibles dans la portée de la méthode.

Une classe interne/anonyme, dispose de sa propre portée et de son propre
cycle de vie (on pourrait par exemple penser à un Thread, il va
continuer à s'exécuter bien apprés que la fin de l'exécution de la
méthode ne soit intervenue.

Or afin d'être sur que l'on a bien toujours à faire au même objet, même
aprés la "mort" de la fonction, on rajoute "final" car cela permet
d'éviter de changer l'objet pointé par la référence.

Ainsi, dès le moment de l'initialisation du constructeur dans ta méthode
, sans que tu le voie, le compilo va passer à ta classe interne cette
référence (sur l'objet) afin d'être utilisé dans la portée de ta
nouvelle classe. Et il n'y a pas besoin de plus de chose, tout
simplement car ta référence étant final, l'objet pointé est toujours le
même, donc garder une copie de la référence, c'est garder "le bon objet" ;-)

Mais si tu as un peu suivit le raisonement, tu dois te dire "mais, mon
type c'est pas un "objet". Oui, effectivement, c'est un type simple,
alors remplace :
"référence" par "valeur"
"objet" par "type simple"

Et c'est pareil ;-)

Version courte :

Il ne faut pas que ta valeur change vu que la copie de la variable
(type simple = copie par valeur) est faite à l'initialisation de ton
constructeur new Droite() implicitement !


J'ai toujours préféré les version longues :)

A+

TM


matlerouge wrote:
Bonjour

Voici un petit bout de code :

...
public void droite(final double a)
{
classe Droite extend foo
{
public void execute { (droite(a) };
}
programme.add(new Droite());
}
...


On me dit qu'il est obligatoire que l'argument de 'droite' contienne le
modificateur 'final'. Apparement cela est necessaire quand on definit
une classe dans une fonction. Je ne comprend pas tres bien pourquoi,
pouvez vous m'eclairer ?

Merci d'avance