UPPA - Année universitaire 2015-2016 Département informatique

publicité
UPPA - Année universitaire 2015-2016
Département informatique
Licence informatique 3e année
[email protected]
Examen de 1ère session – TOO
Vous n'avez droit à AUCUN document
Un programmeur a décidé de programmer en Java (voir le bas de cette page) une classe « utilitaire » lui permettant
de définitivement calculer si une année est bissextile ou non. Toutefois, son manque de connaissances en Java (il a
fait que du C dans sa vie, c’est malheureux) lui fait faire des erreurs.
Question 1 (5 points) : il y a 5 fois le mot-clef « final » dans le code. Dans l’ordre d’apparition, dire pour chacune
d’elles si « final » est utile ou non. Répondre « utile » ou « inutile » avec justification courte.
Question 2 (3 points) : est-il judicieux de rendre les deux fonctions « annee_bissextile_oui_ou_non » polymorphes,
et si « oui », par quel mot-clef ajouté ?
Question 3 (3 points) : y-a-t-il une ou des ligne(s) qui empêche(nt) la compilation, si « oui », laquelle/lesquelles ?
Question 4 (3 points) : qu’affiche le programme si l’on a supprimé la ou les ligne(s) qui empêche(nt) la compilation ?
Question 5 (6 points) : donnez une version minimaliste (faites le minimum de corrections dans le programme initial
pour qu’il fonctionne) dans laquelle les deux fonctions « annee_bissextile_oui_ou_non » ne sont pas « static ».
final public class Utilitaire_annee_bissextile {
int _year;
final public static boolean annee_bissextile_oui_ou_non(final int year) {
assert (year >= 0);
_year = year;
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
final public static boolean annee_bissextile_oui_ou_non(final java.util.Calendar calendrier) {
int year = calendrier.get(java.util.Calendar.YEAR);
_year = year;
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
public static void main(String[] args) {
System.out.println(Utilitaire_annee_bissextile.annee_bissextile_oui_ou_non(2000));
System.out.println(Utilitaire_annee_bissextile.annee_bissextile_oui_ou_non(java.util.Calendar.getInstance()));
}
}
Correction
Q1 :





Utile : empêche l’héritage ce qui est ici logique vu que la classe n’a que 2 fonctions « static »
Inutile : l’héritage a été empêché
Inutile : type primitif passé par copie
Inutile : l’héritage a été empêché
Utile : type non primitif, donc on garantit l’impossibilité de changement d’objet en bloquant l’affectation
Q2 :

Non, des fonctions « static » sont par définition non polymorphes. Sinon, on pourrait imaginer enlever le
mot « static » mais il n’y a pas d’intérêt direct. Dans cette situation, les fonctions deviennent
automatiquement polymorphes (pas de mot clef dédié en Java)
Q3 :

« _year = year; ». Plus généralement, « _year » est une variable d’instance qui ne sert à rien
Q4 :


« true »
« false »
Q5 :
final public class Utilitaire_annee_bissextile {
int _year;
public boolean annee_bissextile_oui_ou_non(final int year) { // ‘final’ ne sert à rien
assert (year >= 0);
_year = year;
return ((_year % 4 == 0) && (_year % 100 != 0)) || (_year % 400 == 0);
}
public boolean annee_bissextile_oui_ou_non(final java.util.Calendar calendrier) { // ‘final’ ne sert à rien
_year = calendrier.get(java.util.Calendar.YEAR);
return annee_bissextile_oui_ou_non(_year); // On appelle la version d’avant, plus simple
}
public static void main(String[] args) {
Utilitaire_annee_bissextile uab = new Utilitaire_annee_bissextile(); // C’était ça qui était important
System.out.println(uab.annee_bissextile_oui_ou_non(2000));
System.out.println(uab.annee_bissextile_oui_ou_non(java.util.Calendar.getInstance()));
}
}
Téléchargement