Un problème de java par rapport à C++ c'est que _toutes_ les méthodes sont virtuelles par défaut. Au niveau langague objet, c'est un plus, l'héritage et bien plus facile et souple. Il n'y a pas non plus de problèmes avec les interfaces des API si les fonctions publiques changes.
Mais quand je pense à tout les getTruc setTruc que contiennent les codes java avec:
int getTruc(){ return this.truc; }
void setTruc(int truc){ this.truc = truc; }
ou pour affecter une variable on doit:
1. aller chercher dans la v-table de l'objet le pointeur sur la fonction
2. créer la fonction
3. faire l'affectation
4. gérer le retour de la fonction
alors que si la fonction était non virtuelle le compilo aurait simplement mis en ligne this.truc = truc, je me dis que "a = a + b" ne doit pas être gros problème.
Biensûr on peut mettre la fonction en final, mais comme personne ne le fait les compilos ne sont pas optimisés pour. On peut aussi tout écrire avec des variables publiques mais c'est très dangereux (pas de var en lecture seul).
démo:
class Test {
public int var;
public int getVar() {
return this.var;
}
public void setVar(int var) {
this.var = var;
}
public static void main() {
int i;
Test t = new Test();
i = t.getVar();
t.setVar(i);
i = t.var;
t.var= i;
}
}
# javac Test.java
# javap -c Test
Method int getVar()
0 aload_0
1 getfield #2 <Field int var>
4 ireturn
[^] # Re: souhait pour un futur article sur java
Posté par Marc . En réponse à la dépêche Hors Série Java, seconde édition. Évalué à 10.
Mais quand je pense à tout les getTruc setTruc que contiennent les codes java avec:
int getTruc(){ return this.truc; }
void setTruc(int truc){ this.truc = truc; }
ou pour affecter une variable on doit:
1. aller chercher dans la v-table de l'objet le pointeur sur la fonction
2. créer la fonction
3. faire l'affectation
4. gérer le retour de la fonction
alors que si la fonction était non virtuelle le compilo aurait simplement mis en ligne this.truc = truc, je me dis que "a = a + b" ne doit pas être gros problème.
Biensûr on peut mettre la fonction en final, mais comme personne ne le fait les compilos ne sont pas optimisés pour. On peut aussi tout écrire avec des variables publiques mais c'est très dangereux (pas de var en lecture seul).
démo:
class Test {
public int var;
public int getVar() {
return this.var;
}
public void setVar(int var) {
this.var = var;
}
public static void main() {
int i;
Test t = new Test();
i = t.getVar();
t.setVar(i);
i = t.var;
t.var= i;
}
}
# javac Test.java
# javap -c Test
Method int getVar()
0 aload_0
1 getfield #2 <Field int var>
4 ireturn
Method void setVar(int)
0 aload_0
1 iload_1
2 putfield #2 <Field int var>
5 return
Method void main()
0 new #3 <Class Test>
3 dup
4 invokespecial #4 <Method Test()>
7 astore_1
8 aload_1
9 invokevirtual #5 <Method int getVar()>
12 istore_0
13 aload_1
14 iload_0
15 invokevirtual #6 <Method void setVar(int)>
18 aload_1
19 getfield #2 <Field int var>
22 istore_0
23 aload_1
24 iload_0
25 putfield #2 <Field int var>
28 return
Même résultats avec et sans final get|setTruc.
# java -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.3.0-FCS)
Java HotSpot(TM) Client VM (build Blackdown-1.3.0-FCS, mixed mode)
hop -> -1, c'est un peu long