Aller zou, le beau temps revient et les envies de me faire plaisir aussi.
J’avais besoin d’effectuer des opérations répétitives sur un groupe de variables. J’ai donc essayé de faire avec les générics une classe utilitaire pour faire ce traitement « facilement ».
Déclaration
Donc tout d’abord, la classe en question :
-
package fr.fluminis.blog;
-
-
import java.util.List;
-
-
/**
-
* Apply
-
*
-
* Execute une fonction sur une liste d'elements
-
* @author fluminis
-
*/
-
public class Apply<E> {
-
-
/**
-
* Execute une fonction sur un nombre variable d'elements
-
*
-
* @param <E>
-
* type de l'element
-
* @param action
-
* action a executer sur toute la liste d'elements
-
* @param objetcs
-
* suite d'elements a traiter (de 1 à N éléments)
-
*/
-
public static <E> void apply(IAction<E> action, E… objetcs) {
-
for (E e : objetcs) {
-
action.doAction(e);
-
}
-
}
-
-
/**
-
* Execute une fonction sur une liste d'elements
-
*
-
* @param <E>
-
* type de l'element
-
* @param action
-
* action a executer sur toute la liste d'elements
-
* @param objetcs
-
* liste d'elements a traiter
-
*/
-
public static <E> void apply(IAction<E> action, List<E> objetcs) {
-
if (objetcs != null && objetcs.size() > 0) {
-
for (E e : objetcs) {
-
action.doAction(e);
-
}
-
}
-
}
-
}
On note ici que l’utilisation des « … » nous permet d’avoir un nombre variable d’arguments de type E.
Ensuite il nous suffit d’une petite interface pour exécuter nos actions :
-
package fr.fluminis.blog;
-
-
/**
-
* IAction
-
*
-
* Interface permettant d'exécuter une action sur un element
-
* @author fluminis
-
*/
-
public interface IAction<E> {
-
void doAction(E e);
-
}
Utilisation
Bien, tout est en place. Un petit exemple qui fait un system.out de tous les arguments :
La manière la plus simple mais assez crade est de créer la classe directement dans le code :
-
public static void main(String[] args) {
-
Integer i1 = 1;
-
Integer i2 = 2;
-
Apply.apply(new IAction<Integer>() {
-
public void doAction(Integer i) {
-
System.out.println(i);
-
}
-
}, i1, i2);
-
}
Par contre si vous avez besoin de refaire ce traitement ailleurs, je vous conseille de créez une vraie classe pour ne pas dupliquer le code.
Si vous n’avez pas besoin que votre classe action soit générique, vous n’avez qu’à la déclarer comme cela :
-
package fr.fluminis.blog;
-
-
public class MonAction implements IAction<MaClasse> {
-
public void doAction(MaClasse e) {
-
System.out.println("-> " + e);
-
};
-
}
Et l’utiliser, comme cela :
-
MaClasse obj1;
-
MaClasse obj2;
-
…
-
Apply.apply(new MonAction(), obj1, obj2);
Mais continuons avec les generics, on peut pousser le vice a créer une classe qui est encore une fois générique, ainsi le traitement peut être fait sur n’importe quel type d’objet :
-
package fr.fluminis.blog;
-
-
public class PrintAction<E> implements IAction<E> {
-
public void doAction(E e) {
-
System.out.println("-> " + e);
-
};
-
}
Que vous utiliserez comme cela :
-
Integer i1;
-
Integer i2;
-
…
-
Apply.apply(new PrintAction<Integer>(), i1, i2);
-
-
ou
-
-
MaClasse obj1;
-
MaClasse obj2;
-
…
-
Apply.apply(new PrintAction<MaClasse>(), obj1, obj2);
Have fun !