Approche Objet - TD2 : Listes Circulaires
-
Affichage
On considère la classe CircularList
ci-jointe.
Modifier CircularList
pour que l'instruction
System.out.println(c);
où c est une instance de
CircularList
et n sa taille,
affiche le résultat suivant sur la sortie standard : Circular
list of size n
Par exemple, l'exécution du code suivant
CircularList cl = new CircularList(1, 2, 3);
System.out.print(cl);
affichera sur la sortie standard :
Circular list of size 3
-
Encapsulation
Le résultat des instructions suivantes
Object [] a = {1, 2, 3};
CircularList cl = new CircularList(a);
System.out.print(cl.get(0) + " ");
*** instruction cachée ***
System.out.println(cl.get(0));
est :
1 4
où l'instruction cachée ne contient aucune référence à la
variable cl
.
Donner le contenu de l'instruction cachée et corriger le défaut
d'encapsulation constaté.
-
Ajouter une méthode
Object nextElement()
qui
renvoie l'élément du tableau elements
suivant
l'élément retourné par l'appel précédent à nextElement
.
Le premier appel à nextElement
renverra le premier
élément de la liste circulaire, c'est à dire l'élément d'indice
0 dans elements
. L'élément qui suit l'élément
d'indice size() - 1
est également l'élément
d'indice 0.
Par exemple, l'exécution des instructions suivantes
CircularList cl = new CircularList(1, 2, 3);
for (int i = 0; i < 10; i++)
System.out.print(cl.nextElement() + " ");
affichera sur la sortie standard :
1 2 3 1 2 3 1 2 3 1
-
Exceptions
- Modifier
CircularList
de telle façon qu'un
appel de la méthode indexOf(Object o)
lève une
exception ObjectMissingException
si l'objet o
n'est pas présent.
- Donner le code de la classe
ObjectMissingException
.
Par exemple, l'exécution des instructions suivantes
CircularList cl = new CircularList(1, 2, 3);
System.out.println(cl);
int i = cl.indexOf(4);
provoquera l'affichage suivant :
Circular List of size 3
Exception in thread "main" Object 4 is missing
at
circularlist.CircularList.indexOf(CircularList.java:29)
at
Main.main(Main.java:9)
-
Classe générique
Modifier CircularList
de telle façon que le type
de ses éléments devienne générique.
-
Égalité
Pour les deux questions suivantes, il est recommandé de regarder
les méthodes disponibles à partir de la classe java.util.Arrays.
- Modifier
CircularList
de telle façon que
deux listes circulaires soient égales si et seulement si
elles ont les mêmes éléments dans le même ordre.
- Quelle autre méthode de
CircularList
(héritée de la classe Object
) est-il
nécessaire de ré-écrire ? Proposer une implémentation de
cette méthode.
-
Listes circulaires modifiables, délégation
- On souhaite à présent pouvoir utiliser des listes
circulaires modifiables dans lesquelles il est possible
d'ajouter un élément via les méthodes suivantes :
void add(int index, E element);
Le comportement de ces deux méthodes est similaire à celui
des méthodes add
de l'interface List<E>
.
Modifier l'implémentation de CircularList
pour
répondre à ces nouvelles fonctionnalités en utilisant la
délégation avec un objet de type java.util.List
.
Par exemple, l'exécution des instructions suivantes
CircularList<String> cls = new
CircularList<String>("4", "septembre", "2017");
cls.add(0, "lundi");
System.out.print(cls + "[);
for (int i = 0; i < cls.size(); i++)
System.out.print(cls.get(i) +
",");
System.out.println("]");
affichera sur la sortie standard :
Circular List of size 4 [lundi,4,septembre,2017]
- Ajouter une troisième méthode addAll prenant en
paramètre une liste circulaire et ajoutant tous les éléments
de cette liste à la liste courante, sur le modèle de la
méthode addAll de l'interface List.
-
Union
Dans une classe CircularLists, écrire une méthode de
classe union
qui retourne l'union de deux
listes circulaires. Le type des éléments des listes passées en
paramètre pourra être un sous-type du type des éléments de la
liste créée par la méthode union
.
Par exemple, l'exécution des instructions suivantes
CircularList<String> cls1 = new
CircularList<String>("lundi", "4", "septembre", "2017");
CircularList<String> cls2 = new
CircularList<String>( "5", "septembre", "2017");
CircularList<String> clsu = CircularLists.union(cls1,
cls2);
System.out.println(clsu);
affichera sur la sortie standard :
Circular List of size 7
et l'exécution des instructions suivantes
CircularList<Double> clf = new
CircularList<Double>(2., 6.5, 14.);
CircularList<Integer> cli = new
CircularList<Integer>(2, 6, 14);
CircularList<Number> cln = CircularLists.union(clf,
cli);
System.out.println(cln);
affichera sur la sortie standard :
Circular List of size 6
-
Utilisation du modèle de conception décorateur
Il s'agit d'utiliser un décorateur pour rendre non modifiable
une liste circulaire modifiable.
Tester la méthode static <T> List<T>
unmodifiableList(List<? extends T> list) de la
classe java.util.Collections.
Sur le modèle de cette méthode, rajouter à la classe CircularLists
une méthode unmodifiableCircularList qui renvoie une vue non
modifiable d'une liste circulaire. En particulier, tout appel
à une méthode modifiant la liste "décorée non-modifiable"
devra lever une exception java.lang.UnsupportedOperationException.