:: Enseignements :: ESIPE :: E3INFO :: 2015-2016 :: Programmation Objet avec Java ::
[LOGO]

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.
  1. 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?
  2. É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?
  3. Écrire un autre constructeur qui prend juste un titre et pas d'auteur.
    On initialisera le champ author avec "<no author>" dans ce cas.
  4. Comment le compilateur fait-il pour savoir quel constructeur appeler ?

Exercice 2 - Liberté, Égalité, Fraternité

  1.     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?
  2. 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.

  1. É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!");
    
  2. Écrire une méthode numberOfBooks qui renvoie le nombre de livres stockés actuellement dans le caddie.
  3. É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!
    
  4. É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 ?
  5. É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.

  1. Créer une classe FreeShoppingCart, son constructeur ainsi que la méthode add.
  2. Comment enlever le warning que le compilateur signale sur la méthode ArrayList.add ?
  3. Écrire la méthode numberOfBooks qui renvoie le nombre de livres.
  4. 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.
  5. É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é.
  6. Écrire une 3ième version de la méthode longestTitle utilisant une boucle foreach.
  7. Comment le compilateur compile t'il une boucle foreach sur une collection ?
    Utiliser la commande javap si vous ne savez pas !
    javap -c FreeShoppingCart
    
  8. É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 ?
  9. Écrire la méthode removeAllOccurences. Quelle est la complexité de cette méthode (lire la doc de la méthode remove que vous utilisez).
  10. 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 ?
  11. 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é ?
  12. 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.