Quelle est l'utilisation des classes anonymes en Java? Peut-on dire que l'utilisation de la classe anonyme est l'un des avantages de Java?
309
Quelle est l'utilisation des classes anonymes en Java? Peut-on dire que l'utilisation de la classe anonyme est l'un des avantages de Java?
Réponses:
Par "classe anonyme", je suppose que vous entendez une classe interne anonyme .
Une classe interne anonyme peut s'avérer utile lors de la création d'une instance d'un objet avec certains "extras" tels que des méthodes de substitution, sans avoir à sous-classer réellement une classe.
J'ai tendance à l'utiliser comme raccourci pour attacher un écouteur d'événement:
L'utilisation de cette méthode rend le codage un peu plus rapide, car je n'ai pas besoin de créer une classe supplémentaire qui implémente
ActionListener
- je peux simplement instancier une classe interne anonyme sans réellement créer une classe séparée.J'utilise cette technique uniquement pour les tâches "rapides et sales" où rendre une classe entière semble inutile. Avoir plusieurs classes internes anonymes qui font exactement la même chose devrait être refactorisé en une classe réelle, que ce soit une classe interne ou une classe distincte.
la source
overloading methods
et nonoverriding methods
?Les classes internes anonymes sont en réalité des fermetures, elles peuvent donc être utilisées pour émuler des expressions lambda ou des «délégués». Par exemple, prenez cette interface:
Vous pouvez l'utiliser de manière anonyme pour créer une fonction de première classe en Java. Disons que vous avez la méthode suivante qui renvoie le premier nombre supérieur à i dans la liste donnée, ou i si aucun nombre n'est plus grand:
Et puis vous avez une autre méthode qui retourne le premier nombre plus petit que i dans la liste donnée, ou i si aucun nombre n'est plus petit:
Ces méthodes sont presque identiques. En utilisant le type de fonction de première classe F, nous pouvons les réécrire en une seule méthode comme suit:
Vous pouvez utiliser une classe anonyme pour utiliser la méthode firstMatch:
C'est un exemple vraiment artificiel, mais il est facile de voir qu'être capable de passer des fonctions comme s'il s'agissait de valeurs est une fonctionnalité assez utile. Voir «Votre langage de programmation peut-il le faire» par Joel lui-même.
Une jolie bibliothèque pour programmer Java dans ce style: Java fonctionnel.
la source
La classe interne anonyme est utilisée dans le scénario suivant:
1.) Pour remplacer (sous-classement), lorsque la définition de classe n'est pas utilisable, sauf dans le cas actuel:
2.) Pour la mise en œuvre d'une interface, lorsque la mise en œuvre de l'interface n'est requise que pour le cas actuel:
3.) Classe interne anonyme définie par argument:
la source
Je les utilise parfois comme hack de syntaxe pour l'instanciation de la carte:
contre
Il enregistre une certaine redondance lors de l'exécution de nombreuses instructions put. Cependant, j'ai également rencontré des problèmes lors de cette opération lorsque la classe externe doit être sérialisée via l'accès à distance.
la source
Ils sont couramment utilisés comme une forme verbeuse de rappel.
Je suppose que vous pourriez dire qu'ils sont un avantage par rapport à ne pas les avoir et à créer une classe nommée à chaque fois, mais des concepts similaires sont beaucoup mieux implémentés dans d'autres langages (comme les fermetures ou les blocs)
Voici un exemple de swing
Bien qu'il soit toujours très verbeux, c'est beaucoup mieux que de vous forcer à définir une classe nommée pour chaque auditeur à jeter comme ça (bien que selon la situation et la réutilisation, cela peut toujours être la meilleure approche)
la source
myButton.addActionListener(e -> { /* do stuff here */})
oumyButton.addActionListener(stuff)
serait terser.Vous l'utilisez dans des situations où vous devez créer une classe à des fins spécifiques dans une autre fonction, par exemple, en tant qu'écouteur, en tant que runnable (pour générer un thread), etc.
L'idée est que vous les appeliez depuis l'intérieur du code d'une fonction afin de ne jamais vous y référer ailleurs, vous n'avez donc pas besoin de les nommer. Le compilateur les énumère simplement.
Ils sont essentiellement du sucre syntaxique et devraient généralement être déplacés ailleurs à mesure qu'ils grossissent.
Je ne sais pas si c'est l'un des avantages de Java, bien que si vous les utilisez (et nous les utilisons tous fréquemment, malheureusement), alors vous pourriez affirmer qu'ils en sont un.
la source
GuideLines for Anonymous Class.
La classe anonyme est déclarée et initialisée simultanément.
La classe anonyme doit étendre ou implémenter une et une seule classe ou interface resp.
Comme la classe anonymouse n'a pas de nom, elle ne peut être utilisée qu'une seule fois.
par exemple:
la source
ref.getClass().newInstance()
.Oui, les classes internes anonymes sont certainement l'un des avantages de Java.
Avec une classe interne anonyme, vous avez accès aux variables finales et membres de la classe environnante, ce qui est pratique pour les auditeurs, etc.
Mais un avantage majeur est que le code de classe interne, qui est (au moins devrait être) étroitement couplé à la classe / méthode / bloc environnante, a un contexte spécifique (la classe, la méthode et le bloc environnants).
la source
C'est également l'un des exemples de type interne anonyme utilisant un thread
la source
j'utilise des objets anonymes pour appeler de nouveaux Threads ..
la source
Une classe interne est associée à une instance de la classe externe et il existe deux types spéciaux: classe locale et classe anonyme . Une classe anonyme nous permet de déclarer et d'instancier une classe en même temps, ce qui rend le code concis. Nous les utilisons lorsque nous avons besoin d'une classe locale une seule fois car ils n'ont pas de nom.
Prenons l'exemple de doc où nous avons une
Person
classe:et nous avons une méthode pour imprimer les membres qui correspondent aux critères de recherche comme:
où
CheckPerson
est une interface comme:Nous pouvons maintenant utiliser une classe anonyme qui implémente cette interface pour spécifier des critères de recherche comme:
Ici, l'interface est très simple et la syntaxe de la classe anonyme semble compliquée et peu claire.
Java 8 a introduit un terme interface fonctionnelle qui est une interface avec une seule méthode abstraite, donc nous pouvons dire que
CheckPerson
c'est une interface fonctionnelle. Nous pouvons utiliser l' expression Lambda qui nous permet de passer la fonction comme argument de méthode comme:Nous pouvons utiliser une interface fonctionnelle standard
Predicate
à la place de l'interfaceCheckPerson
, ce qui réduira encore la quantité de code requise.la source
La classe interne anonyme peut être bénéfique tout en donnant différentes implémentations pour différents objets. Mais doit être utilisé avec parcimonie car cela crée un problème de lisibilité du programme.
la source
L'une des principales utilisations des classes anonymes dans la finalisation des classes qui appelait le gardien du finaliseur . Dans le monde Java, l'utilisation des méthodes de finalisation doit être évitée jusqu'à ce que vous en ayez vraiment besoin. Vous devez vous rappeler que lorsque vous remplacez la méthode finalize pour les sous-classes, vous devez toujours invoquer
super.finalize()
également, car la méthode finalize de super class ne sera pas invoquée automatiquement et vous pouvez avoir des problèmes avec les fuites de mémoire.compte tenu du fait mentionné ci-dessus, vous pouvez simplement utiliser les classes anonymes comme:
En utilisant cette technique, vous avez soulagé vous-même et vos autres développeurs d'appeler
super.finalize()
chaque sous-classe de laHeavyClass
méthode qui doit être finalisée.la source
Vous pouvez utiliser la classe anonyme de cette façon
la source
Il semble que personne ne soit mentionné ici, mais vous pouvez également utiliser une classe anonyme pour contenir un argument de type générique (qui a normalement été perdu en raison de l'effacement de type) :
Si vous instanciez cette classe de manière anonyme
alors cette
holder
instance contiendra une définition non effacée du type passé.Usage
C'est très pratique pour construire des validateurs / désérialisateurs. Vous pouvez également instancier un type générique avec réflexion (donc si vous avez toujours voulu le faire
new T()
en type paramétré - vous êtes les bienvenus!) .Inconvénients / limitations
la source
La meilleure façon d'optimiser le code. aussi, nous pouvons utiliser pour une méthode prioritaire d'une classe ou d'une interface.
la source
Une classe interne anonyme est utilisée pour créer un objet qui ne sera plus jamais référencé. Il n'a pas de nom et est déclaré et créé dans la même instruction. Ceci est utilisé là où vous utiliseriez normalement la variable d'un objet. Vous remplacez la variable par le
new
mot clé, un appel à un constructeur et la définition de classe à l'intérieur de{
et}
.Lors de l'écriture d'un programme threadé en Java, il ressemblerait généralement à ceci
L'
ThreadClass
utilisé ici serait défini par l'utilisateur. Cette classe implémentera l'Runnable
interface requise pour créer des threads. Dans laThreadClass
larun()
méthode (seule méthodeRunnable
) doit être mis en œuvre aussi bien. Il est clair que se débarrasser deThreadClass
serait plus efficace et c'est exactement pourquoi il existe des classes internes anonymes.Regardez le code suivant
Ce code remplace la référence faite
task
dans l'exemple le plus en haut. Plutôt que d'avoir une classe distincte, la classe interne anonyme à l'intérieur duThread()
constructeur renvoie un objet sans nom qui implémente l'Runnable
interface et remplace larun()
méthode. La méthoderun()
comprendrait des instructions à l'intérieur qui effectuent le travail requis par le thread.Répondant à la question de savoir si les classes internes anonymes est l'un des avantages de Java, je dois dire que je ne suis pas sûr car je ne connais pas beaucoup de langages de programmation pour le moment. Mais ce que je peux dire, c'est que c'est définitivement une méthode de codage plus rapide et plus facile.
Références: Sams Teach Yourself Java in 21 Days Seventh Edition
la source
Un autre avantage:
comme vous savez que Java ne prend pas en charge l'héritage multiple, donc si vous utilisez une sorte de classe "Thread" comme classe anonyme, la classe a encore un espace pour toute autre classe à étendre.
la source