Si vous n'avez besoin de rien comme type, vous pouvez utiliser void. Cela peut être utilisé pour implémenter des fonctions ou des actions. Vous pourriez alors faire quelque chose comme ceci :
interface Action<T> {
public T execute();
}
abstract class VoidAction implements Action<Void> {
public Void execute() {
executeInternal();
return null;
}
abstract void executeInternal();
}
Ou bien vous pouvez omettre la classe abstraite, et faire le retour null dans chaque action qui ne nécessite pas une valeur de retour vous-même.
Vous pourriez alors utiliser ces actions comme ceci :
Étant donné une méthode
private static <T> T executeAction(Action<T> action) {
return action.execute();
}
vous pouvez l'appeler comme
String result = executeAction(new Action<String>() {
@Override
public String execute() {
//code here
return "Return me!";
}
});
ou, pour l'action void (notez que vous n'affectez pas le résultat à quoi que ce soit)
executeAction(new VoidAction() {
@Override
public void executeInternal() {
//code here
}
});
1 votes
J'écris un interpréteur pour un format de fichier, en utilisant le modèle d'interpréteur, mais certaines expressions n'ont pas de valeurs de retour.
4 votes
Il n'y a aucun moyen d'instancier le type Void, donc si vous devez vraiment retourner quelque chose de ce type, null est votre seule option. Cependant, vous n'avez probablement pas besoin de la valeur retournée pour quoi que ce soit, donc null devrait convenir.
0 votes
Oui, c'était ma logique aussi - je me demandais juste s'il y avait un moyen plus sémantique.
1 votes
Je le coderais comme votre exemple. C'est une bonne approche.