Est-ce même possible ?
Réponses
Trop de publicités?si vous voulez dire une fonction anonyme, alors en un mot, non.
Cependant, vous pouvez implémenter une interface avec une fonction comme celle-ci :
Comparator<String> c = new Comparator<String>() {
int compare(String s, String s2) { ... }
};
et vous pouvez l'utiliser avec des classes internes pour obtenir une fonction presque anonyme :)
Voici un exemple de classe interne anonyme.
System.out.println(new Object() {
@Override public String toString() {
return "Hello world!";
}
}); // prints "Hello world!"
Ce n'est pas très utile tel quel, mais cela montre comment créer une instance d'une classe interne anonyme qui extends Object
et @Override
son toString()
méthode.
Voir aussi
Les classes internes anonymes sont très pratiques lorsque vous devez implémenter une interface
qui n'est pas forcément très réutilisable (et qui ne vaut donc pas la peine d'être refactorisée en une classe propre). Un exemple instructif est l'utilisation d'une classe java.util.Comparator<T>
pour le tri.
Voici un exemple de la manière dont vous pouvez trier une String[]
sur la base de String.length()
.
import java.util.*;
//...
String[] arr = { "xxx", "cd", "ab", "z" };
Arrays.sort(arr, new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
System.out.println(Arrays.toString(arr));
// prints "[z, cd, ab, xxx]"
Notez l'astuce de comparaison par soustraction utilisée ici. Il faut dire que cette technique est cassée en général : elle n'est applicable que lorsque l'on peut garantir qu'elle ne débordera pas (comme c'est le cas de String
longueurs).
Voir aussi
-
Java Integer : quelle est la comparaison ou la soustraction la plus rapide ?
- La comparaison par soustraction est brisé en général
- Créer un hachage trié en Java avec un comparateur personnalisé
- Comment les classes anonymes (internes) sont-elles utilisées en Java ?
Avec l'introduction de l'expression lambda dans Java 8, vous pouvez maintenant avoir des méthodes anonymes.
Disons que j'ai une classe Alpha
et je veux filtrer Alpha
sur une condition spécifique. Pour ce faire, vous pouvez utiliser un Predicate<Alpha>
. Il s'agit d'une interface fonctionnelle qui possède une méthode test
qui accepte un Alpha
et renvoie un boolean
.
En supposant que la méthode de filtrage a cette signature :
List<Alpha> filter(Predicate<Alpha> filterPredicate)
Avec l'ancienne solution de la classe anonyme, vous auriez besoin de quelque chose comme :
filter(new Predicate<Alpha>() {
boolean test(Alpha alpha) {
return alpha.centauri > 1;
}
});
Avec les lambdas de Java 8, vous pouvez le faire :
filter(alpha -> alpha.centauri > 1);
Pour des informations plus détaillées, voir le Tutoriel sur les expressions lambda
Des classes internes anonymes implémentant ou étendant l'interface d'un type existant ont été réalisées dans d'autres réponses, même s'il convient de noter que de multiples méthodes peuvent être implémentées (souvent avec des événements de type JavaBean, par exemple).
Une caractéristique peu connue est que, bien que les classes internes anonymes n'aient pas de nom, elles ont un type. De nouvelles méthodes peuvent être ajoutées à l'interface. Ces méthodes ne peuvent être invoquées que dans des cas limités. Principalement directement sur le new
l'expression elle-même et à l'intérieur de la classe (y compris les initialisateurs d'instance). Cela peut dérouter les débutants, mais cela peut être "intéressant" pour la récursion.
private static String pretty(Node node) {
return "Node: " + new Object() {
String print(Node cur) {
return cur.isTerminal() ?
cur.name() :
("("+print(cur.left())+":"+print(cur.right())+")");
}
}.print(node);
}
(J'ai initialement écrit ceci en utilisant node
plutôt que cur
dans le print
méthode. Dites NON à la capture "implicite final
Les "locaux" ? )