:: Enseignements :: ESIPE :: E4INFO :: 2012-2013 :: Java Avancé ::
[LOGO]

List et Map


Implantation des interfaces List et Map et un peu de réflexion.

Exercice 1 - Lists

Le but de cette exercice est d'écrire deux méthodex statiques renvoyant des listes particulières à l'intérieur d'une classe fr.umlv.colls.Lists.

  1. Rappeler à quoi servent les classes AbstractList, AbstractSequentialList et RandomAccess.
  2. Ecrire une méthode range qui prend en paramètre un index start et un index end et qui renvoie une liste dont les éléments sont les éléments compris entre start et end (start et end étant inclues).
    L'astuce est que l'on n'est pas obligé de stocker les éléments entre start et end. On peut juste faire en sorte que l'implantation renvoie les éléments entre start et end.
    Vérifier que votre implantation est bonne avec le test unitaire suivant: ListsTest.java.
  3. On souhaite maintenant écrire une méthode times qui prend en paramètre un multiplicateur et une liste d'entiers et qui renvoie une nouvelle liste où chaque entier à la position i a pour valeur l'entier à la position i dans la liste passée en paramètre multipliée par le multiplicateur.
  4. Expliquer pourquoi le test slooowTimes timeout ?
    Comment corriger le problème ?
  5. Implanter la solution retenue.

Exercice 2 - Maps

On cherche maintenant à écrire une classe fr.umlv.colls.Maps. Cette classe possède une méthode statique asMap qui permet de voir n'importe quel objet sous la forme d'une Map dont les clés sont les propriétés (properties) non statiques de l'objet et dont les valeurs correspondent aux valeurs des propriétés de l'objet.
Un objet définit une propriété s'il possède un getter ou un setter sur cette propriété. Par exemple, la classe java.awt.Point possède une méthode getX, et possède donc une propriété x.

  1. Ecrire dans une classe Main une méthode main qui affiche tous les getters et les setters publics et non statiques de la classe java.awt.Color.
  2. Ajouter une méthode propertyMap qui prend une classe en paramètre et renvoie une Map contenant en clé les noms des propriétés et en valeur un objet Accessor correspondant au couple getter/setter (dont un des deux accesseurs peut être null) public et non statique.
  3. A quoi sert la classe java.lang.ClassValue ?
    (Aide: Lisez la doc :)
  4. Modifier la méthode propertyMap pour que si on l'appel deux fois avec la même classe la Map renvoyée soit la même (au sens de '==').
  5. Ecrire la méthode asMap dans la classe Maps qui prend en paramètre un objet et renvoie une Map dont les clés sont les propriétés de l'objet et dont les valeurs les valeurs des propriétés de l'objet.
    La Map renvoyé ne devra pas permettre d'ajouter de nouvelle propriété, de supprimer une propriété existant. Par contre, elle devra permettre la consultation des valeurs d'une propriété s'il existe un getter, la modification de la valeur d'une propriété s'il existe un setter.
    Enfin, la méthode put (ou Map.Entry.setValue()) aura une sémantique légèrement modifiée par rapport à la méthode put de l'interface Map car celle-ci renverra toujours null au lieu de renvoyer l'ancienne valeur (car cette valeur n'est pas forcément accessible car le getter peut ne pas exister).
    Note: l'interface Map.Entry vous oblige à implanter en plus des méthodes getKey(), getValue() et setValue(), les méthodes hashCode() et equals() avec une sémantique particulière, donc RTFM.
Le test Junit correspondant est MapsTest.java.