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())); } }