:: Enseignements :: ESIPE :: E3INFO :: 2013-2014 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Objets, délégation, structure simple, exceptions
|
Exercice 1 - PolyLine
Le but de cet exercice est de définir
une classe PolyLine qui représente
une ligne brisée définie par une succession
de points, instances de la classe Point vue dans le TD précédent.
On souhaite qu'un objet PolyLine donné puisse
avoir un nombre de points variable, mais borné par un
nombre maximum, défini lors de sa création.
Ce nombre maximum peut donc varier d'une instance de PolyLine à une autre.
Pour définir les points qui constituent la PolyLine
on définira une méthode add() qui permet d'ajouter
un Point à la PolyLine.
Pour tout l'exercice, vous écrirez un main de
test dans la classe PolyLineTest.
-
Étant données les contraintes énoncées plus haut, serait-il
possible de stocker le nombre maximum de points
dans un champ statique? Expliquer pourquoi.
Est-il même nécessaire (ou utile) de stocker le nombre maximum
de points dans un champ? Pourquoi?
-
Écrire le constructeur ainsi que la méthode add() et
une méthode pointCapacity() renvoyant
le nombre de points maximum de la PolyLine.
-
Que se passe-t-il dans add() si on dépasse le nombre maximum de points
(l'objectif n'est pas d'écrire du code spécifique pour éviter cette situation)?
Comment faire pour que ce comportement ne "trahisse" pas l'implémentation interne
de votre PolyLine?
-
Écrire une méthode pointCount() qui renvoie
le nombre de points constituant actuellement la
PolyLine.
-
Écrire une méthode contains() qui renvoie vrai
si le point passé en argument est un des points constitutifs
de la PolyLine. Testez votre code avec le main suivant dans PolyLineTest:
public static void main(String[] args) {
PolyLine poly = new PolyLine(10);
poly.add(new Point(1,1));
poly.add(new Point(2,2));
poly.add(new Point(3,3));
System.out.println(poly.contains(new Point(2,2))); // true
}
-
Que se passe t-il si l'on fait un contains() avec null en argument ?
Et un add() avec null en argument ?
Testez votre code avec le main suivant dans PolyLineTest:
public static void main(String[] args) {
PolyLine poly = new PolyLine(5);
poly.add(new Point(1,1));
poly.add(new Point(2,2));
poly.add(new Point(3,3));
System.out.println(poly.contains(new Point(2,2))); // true
System.out.println(poly.contains(null));
poly.add(null);
System.out.println(poly.contains(new Point(2,2)));
System.out.println(poly.contains(null));
}
Est-il raisonable d'accepter de stocker des points null dans la PolyLine?
Si oui, comment faire? Si non, comment faire?
Exercice 2 - Free PolyLine
On souhaite maintenant simplifier la vie de l'utilisateur
d'une polyline en lui évitant d'indiquer le nombre maximum de points.
Pour cela, on se propose de stocker les points en interne dans une java.util.LinkedList
(allez regarder la documentation).
-
En reprenant les mêmes fonctionnalités que celles de la classe PolyLine,
on veut créer une nouvelle classe FreePolyLine sur la base suivante (pour l'instant,
ne paramétrez pas la LinkedList et laissez là comme ci-dessous):
import java.util.LinkedList;
public class FreePolyLine {
private final LinkedList points;
public FreePolyLine() {
points = new LinkedList();
}
}
Ajouter une méthode add() à cette classe.
A quoi font allusion les warning que le compilateur signale sur
la création de la liste (raw type) ainsi que sur la méthode
linkedList.add() (type safety)?
-
Ajouter une méthode getFirstPoint() qui retourne le premier point de la liste.
Si on conserve la déclaration et l'initialisation de la liste points comme donné ci-dessus,
comment faire pour que le type de retour de la méthode soit Point?
Quel risque comporte cette solution?
-
Pour éviter ces warning, on veut maintenant paramétrer la
déclaration du champ points:
private final LinkedList<Points> points;
Cette modification a des répercussions à trois endroits dans le code (dire lesquelles et les réaliser si besoin):
- dans le constructeur;
- dans la méthode add();
- dans la méthode getFirstPoint().
Regardez ensuite le bytecode généré pour la classe avec la commande javap -c, et retrouvez
les instructions correspondant à (i) la création de l'objet LinkedList,
(ii) l'ajout par add() dans cette liste, (iii) la récupération du premier
élément dans cette liste et enfin (iv) le renvoi de la valeur de retour de la méthode getFirstPoint().
Qu'est devenu le type Point paramètre de la LinkedList dans le bytecode?
-
Que faire de la méthode pointCapacity() qui existait dans PolyLine?
-
Ré-écrire pointCount() et contains()
en regardant la doc de java.util.LinkedList.
Exercice 3 - Table de hachage
On souhaite afficher l'animal préférée de Bob, Alice ou June.
Alice a pour animal préféré : edith le singe.
Bob a pour animal préféré : izard le chamoix.
June a pour animal préféré : gold le poisson rouge.
-
Dans un premier temps, écrire une classe Animal simple qui prend en argument
(sur la ligne de commande par exmeple) le nom d'un enfant
(parmi Bob, Alice et June) et affiche son animal préféré. Exemple:
java Animal Bob
L'animal préféré de Bob est izard le chamoix
-
Ré-écrire le code utilisant une table de hachage
java.util.HashMap (et ses méthodes get() et put() : lire la documentation)
pour éviter les if ... else.
Exercice 4 - [À la maison -- ou plus exactement pour occuper les impatients]
- On souhaite que le code suivant
PolyLine poly = new PolyLine(5);
System.out.println(poly);
Point p0 = new Point();
poly.add(p0);
System.out.println(poly);
Point p1 = new Point(1,1);
poly.add(p1);
System.out.println(poly);
produise l'affichage
[]
[(0,0)]
[(0,0), (1,1)]
Écrire ce qu'il faut dans PolyLine pour que cela fonctionne.
Combienb de String avez vous créé pour chaque ligne du résultat affiché
(on rappelle que les String en java sont constantes)?
-
Même question avec FreePolyLine à la place de PolyLine.
© Université de Marne-la-Vallée