...
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 ?
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 ?