:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Examen de Java sur machine (2h) |
Les sources sont à envoyer par mail à la fin (
forax@univ-mlv.fr)
Exercice 1 - Query Builder (20)
Le but de cet exercice est d'implanter un builder permettant de filtrer et
projeter des ensembles de valeurs un peu à la façon dont SQL fonctionne
mais sur des données résidant en mémoire.
Cet exercice peut être assez simple si l'on prend bien le temps de réfléchir
pour éviter trop de duplication de code.
Sinon, cet exercice va vous sembler fastidieux.
On souhaite developper une classe (en fait, une hierarchie de classe)
nommée
QueryBuilder qui gère un groupe d'élement.
Un objet
QueryBuilder est créer à partir d'un Iterable ou d'un Set.
Voici les fonctionnalités d'un
QueryBuilder:
-
frequency: obtenir le nombre d'occurence d'un élement du groupe ou zéro sinon.
-
count: compter le nombre d'élement du groupe.
-
toSet: obtenir les élements sous forme d'un Set.
-
toIterable: obtenir les élements sous forme d'un Iterable
-
select: filtrer des élements, on gardera les élements pour lesquels
la fonction filter renvoie vrai.
-
apply: transforme les éléments en appliquant à chaque élement la fonction apply.
package fr.umlv.examsept2010;
import java.util.Set;
public abstract class QueryBuilder<E> {
public interface Filter<E> {
public boolean filter(E element);
}
public interface Applier<R, E> {
public R apply(E element);
}
public abstract Set<E> toSet();
public abstract Iterable<E> toIterable();
public abstract int frequency(E element);
public abstract int count();
public abstract QueryBuilder<E> select(Filter<E> filter);
public abstract <R> QueryBuilder<R> apply(Applier<R, E> applier);
public static <E> QueryBuilder<E> from(Set<E> set) {
return null; // insérer votre code ici
}
public static <E> QueryBuilder<E> from(Iterable<E> iterable) {
return null; // insérer votre code ici
}
// insérer votre code ici
}
Votre implantation ne devra en aucun cas copier les éléments
à chaque fois que l'on effectue une opération comme select or apply sur le
QueryBuilder.
Si select ou apply effectue une copie des élements pour les stocker dans une structure de donnée,
votre implantation sera considerée comme hors sujet.
Il vous est demandé de fournir une implantation répondant aux contraintessuivantes:
-
QueryBuilder.from(set).toSet() == set et
QueryBuilder.from(iterable).toIterable() == iterable
-
Les Set renvoyé par toSet doivent respectés l'interface java.util.Set.
-
Vous n'avez le droit d'insérer du code qu'aux endroits marqués 'insérer votre code ici'.
Pour vous aidez, un ensemble de tests unitaires est disponible:
De plus, les signatures des méthodes select et apply sont fausses,
certains tests unitaires ne compileront pas, à vous de modifier ces deux signatures.
Aide1: vous avez le droit de créer des sous-classes en Java !
Aide2: réfléchissez un peu avant de coder, SVP !
© Université de Marne-la-Vallée