:: Enseignements :: ESIPE :: E3INFO :: 2015-2016 :: Programmation Objet avec Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Objets, égalité, délégation... re-belotte et itérateurs
|
Exercice 1 - Livre
On cherche à écrire une classe
Book représentant un livre
avec un titre et le nom de l'auteur.
-
Déclarer dans un paquetage fr.upem.books une classe Book contenant les
champs privés title et author de type String.
Sachant que ces champs ne sont pas sensés changer au cours de la vie du livre,
quel(s) doi(ven)t être les modificateurs utilisés pour la déclaration de ces champs?
-
Écrire un constructeur pour cette classe qui prend deux arguments et initialise
les champs de l'objet créé.
Comment peut on faire pour garantir qu'aucun des deux champs n'est null?
-
Écrire un autre constructeur qui prend juste un titre et pas d'auteur.
On initialisera le champ author avec "<no author>" dans ce cas.
-
Comment le compilateur fait-il pour savoir quel constructeur appeler ?
Exercice 2 - Liberté, Égalité, Fraternité
-
Book b1 = new Book("Da Java Code", "Duke Brown");
Book b2 = b1;
Book b3 = new Book("Da Java Code", "Duke Brown");
System.out.println(b1 == b2);
System.out.println(b1 == b3);
System.out.println(b1.equals(b2));
System.out.println(b1.equals(b3));
Qu'affiche le code ci-dessus ?
Pourquoi ?
Écrire dans la classe Book ce qu'il faut pour que l'affichage produise:
true
false
true
true
Faut il utiliser une annotation?
- On veut pouvoir afficher un livre comme suit:
Book book = new Book("Da Java Code", "Duke Brown");
System.out.println(book);
et que ça affiche "Da Java Code by Duke Brown".
Écrire la méthode nécessaire. Faut il utiliser une annotation?
Exercice 3 - Caddie en amazone
On veut définir
une classe ArrayShoppingCart dans le paquetage
fr.upem.books qui représente
un caddie contenant un ensemble de livres de la classe Book.
On souhaite que chaque ArrayShoppingCart
puisse définir un nombre maximal de livres que l'on
peut stocker dans le caddie.
Le but de cet exercice est d'écrire une classe
ArrayShoppingCart utilisant un tableau
pour stocker les livres, son constructeur spécifiant une capacité maximale
ainsi qu'une méthode add() qui permet d'ajouter
un livre au caddie.
-
Écrire le constructeur ainsi que la méthode add()
sachant que l'on vous demande de stocker les livres dans
un tableau.
Tester, dans le main d'une autre classe ShoppingTest, avec le code suivant:
ArrayShoppingCart cart = new ArrayShoppingCart(3);
// cart.add(null); // this method call must throw an exception
Book book1 = new Book("Da Java Code", "Duke Brown");
cart.add(book1);
cart.add(book1);
cart.add(book1);
// cart.add(book1); // this method call must throw an(other) exception
// System.out.println(cart);
// System.out.println("et voila!");
-
Écrire une méthode numberOfBooks qui renvoie
le nombre de livres stockés actuellement dans le caddie.
-
Écrire une méthode permettant d'afficher le contenu du caddie
avec le nombre de livres en en-tête, puis un livre par ligne.
Attention à ce que votre code n'alloue pas trop d'objets!
En retirant les commentaires des deux dernières lignes du main ci-dessus,
vous devez obtenir quelque chose comme:
3 book(s):
Da Java Code by Duke Brown
Da Java Code by Duke Brown
Da Java Code by Duke Brown
et voila!
-
Écrire une méthode longestTitle() qui retourne le livre
du caddie qui a le titre le plus long.
Que doit-on faire si le caddie est vide ?
-
Écrire une méthode removeAllOccurences qui prend en paramètre
un livre et qui supprime toutes les occurrences de celui-ci dans le caddie.
Exercice 4 - Caddie Libre
L'implantation précédente obligeait le programmeur à choisir
à l'avance un nombre maximal de livres à stocker dans un caddie.
On souhaite lever cette limitation en utilisant la classe
java.util.ArrayList plutôt qu'un tableau pour stocker
les livres dans le caddie.
-
Créer une classe FreeShoppingCart, son constructeur
ainsi que la méthode add.
-
Comment enlever le warning que le compilateur signale
sur la méthode ArrayList.add ?
-
Écrire la méthode numberOfBooks qui renvoie le nombre de livres.
-
On souhaite maintenant écrire la méthode longestTitle.
Utiliser pour cela un indice parcourant la liste et la méthode
ArrayList.get pour obtenir les livres.
-
Écrire une nouvelle version de la méthode longestTitle
et utilisant la méthode ArrayList.iterator puis les méthodes
Iterator.hasNext() et Iterator.next sur l'itérateur
renvoyé.
-
Écrire une 3ième version de la méthode longestTitle
utilisant une boucle foreach.
-
Comment le compilateur compile t'il une boucle foreach sur une collection ?
Utiliser la commande javap si vous ne savez pas !
javap -c FreeShoppingCart
-
Écrire dans la méthode main d'une classe Test
une boucle foreach sur un tableau
(par exemple, celui des arguments du main).
Comparer les résultats avec ceux de la question précédente.
Que pouvez-vous en conclure ?
-
Écrire la méthode removeAllOccurences.
Quelle est la complexité de cette méthode (lire la doc de la méthode remove que vous utilisez).
-
Notez qu'il est possible, au lieu d'utiliser une java.util.ArrayList
pour stocker des livres, d'utiliser la classe java.util.LinkedList.
Modifier la classe FreeShoppingCart et remplacer les mentions à java.util.ArrayList
par celle à java.util.LinkedList et expliquer pourquoi le programme compile toujours.
Cela améliore t'il la complexité (pire cas et moyenne) de removeAllOccurence ?
-
Notez qu'il existe une méthode remove dans la classe java.util.Iterator,
comment l'utiliser pour écrire removeAllOccurence.
Écrire le code correspondant.
Et maintenant, quelle est la complexité ?
-
Conclure en indiquant dans quel cas doit-on utiliser la boucle foreach et
dans quel cas doit-on utiliser un itérateur explicitement sur une collection.
© Université de Marne-la-Vallée