janv.
2009
Java Quiz #26
Pour changer un peu, ce quiz a été rédigé comme une question de la certification SCJP (type de question, formatage du code, etc), afin de vous montrer à quoi cela ressemble. Saurez-vous y répondre ?
Considérant le code suivant, lesquelles de ces propositions sont justes ?
interface Interface1 { String FOO = "foo1"; } interface Interface2 { String FOO = "foo2"; } public class InterfaceMultipleInheritance implements Interface1, Interface2 { public static void main(String[] args) { System.out.println(FOO); } }
- Le code ne compile pas
- Le code compile mais provoque une erreur au runtime
- Le code compile et affiche "foo2"
- Le code compile et fonctionne si on commente la ligne 11
- Le code compile et fonctionne si la valeur assignée aux deux constantes FOO est la même
- Autre
Réponse :
Les réponses 1 et 4 sont les bonnes.
En l'état, le compilateur indique que "The field FOO is ambiguous" à la ligne 11. Il nous signale par là qu'il ne sait pas s'il faut utiliser Interface1.FOO
ou Interface2.FOO
.
Ce qui est surprenant, c'est qu'il ne réagit pas à la ligne 9 en constatant qu'on implémente deux interfaces possédant la même constante : seule l'utilisation de la constante provoque une erreur, d'où la validité de la réponse 4.
Ceci nous amène à évoquer une bonne pratique : ne créez pas d'interfaces contenant uniquement des constantes, car les interfaces peuvent être implémentées de multiples fois et générer des ambigüités comme dans notre exemple. Préférez des classes final
, qui centralisent l'accès à ces constantes.