Quelle est l’utilisation des classes anonymes en java ? Peut-on dire que l’utilisation de classe anonyme est l’un des avantages de java ?
Réponses
Trop de publicités?Par une "classe anonyme", je le prends à vous dire anonyme intérieur de la classe.
Un anonyme intérieur de la classe peut être utile lors d'une instance d'un objet dont certaines "extras" tels que la surcharge des méthodes, sans avoir à réellement sous-classe d'une classe.
J'ai tendance à l'utiliser comme un raccourci pour attacher un écouteur d'événement:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// do something.
}
});
En utilisant cette méthode rend la programmation un peu plus rapidement, comme je n'ai pas besoin de faire un supplémentaire de classe qui implémente ActionListener
-- je peux instancier un anonyme intérieur de la classe sans en faire réellement une classe à part.
Je n'utilise cette technique pour "rapide et sale", les tâches où le fait de créer une classe entière se sent inutile. Le fait d'avoir plusieurs anonymes classes internes qui font exactement la même chose devrait être remaniée à une classe, que ce soit un intérieur de classe ou dans une classe à part.
Anonyme les classes internes sont effectivement fermetures, de sorte qu'ils peuvent être utilisés pour reproduire les expressions lambda ou "délégués". Par exemple, de profiter de cette interface:
public interface F<A, B> {
B f(A a);
}
Vous pouvez l'utiliser de façon anonyme afin de créer une première fonction de classe en Java. Disons que vous avez la méthode suivante qui retourne le nombre premier plus grand que moi dans la liste donnée, ou je si aucun numéro n'est plus:
public static int larger(final List<Integer> ns, final int i) {
for (Integer n : ns)
if (n > i)
return n;
return i;
}
Et puis vous avez une autre méthode qui renvoie le premier nombre plus petit que j'ai dans la liste donnée, ou je si aucun numéro n'est plus petit:
public static int smaller(final List<Integer> ns, final int i) {
for (Integer n : ns)
if (n < i)
return n;
return i;
}
Ces méthodes sont presque identiques. À l'aide de la première classe de la fonction de type F, nous pouvons réécrire dans une méthode comme suit:
public static <T> T firstMatch(final List<T> ts, final F<T, Boolean> f, T z) {
for (T t : ts)
if (f.f(t))
return t;
return z;
}
Vous pouvez utiliser une classe anonyme pour utiliser le firstMatch méthode:
F<Integer, Boolean> greaterThanTen = new F<Integer, Boolean> {
Boolean f(final Integer n) {
return n > 10;
}
};
int moreThanMyFingersCanCount = firstMatch(xs, greaterThanTen, x);
C'est vraiment un exemple artificiel, mais il est facile de voir que le fait d'être en mesure de passer des fonctions autour comme si elles étaient des valeurs est une fonctionnalité très utile. Voir "Votre Langage de Programmation" par Joël lui-même.
Une belle bibliothèque pour la programmation Java dans ce style: Fonctionnel Java.
Une classe interne anonyme est utilisée dans le scénario suivant :
1.) pour Overriding(Sub classing), lorsque la définition de classe n’est pas utilisable, sauf cas d’espèce :
2.) pour implémenter une interface, lors de l’implémentation d’interface est nécessaire uniquement pour les cas courants :
3.) argument défini anonyme classe interne :
Ils sont couramment utilisés comme détaillé forme de rappel.
Je suppose que vous pourriez dire qu'ils sont un avantage par rapport à ne pas en avoir, et d'avoir à créer une classe nommée à chaque fois, mais des concepts similaires sont mis en œuvre beaucoup mieux dans d'autres langues (comme des fermetures ou des blocs)
Voici un swing exemple
myButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// do stuff here...
}
});
Bien qu'il soit encore messily verbeux, c'est beaucoup mieux que de vous forcer à définir une classe nommée pour tous les jeter auditeur comme ceci (bien en fonction de la situation et de la réutilisation, qui peut encore être la meilleure approche)