Comment sont Anonymes intérieur des classes Java?
Qu'est-ce que l'utilisation de l'anonymat de classes en Java? Peut-on dire que l'utilisation de la classe anonyme est l'un des avantages de Java?
- Ce n'est pas tellement un avantage de Java comme il est un moyen de contourner le manque de fermetures en Java.
- Java 8 a introduit les Lambda expressions. Vérifier la réponse: stackoverflow.com/questions/355167/...
Vous devez vous connecter pour publier un commentaire.
Par une "classe anonyme", je le prends à vous dire anonyme intérieur de la classe.
Anonyme intérieur de la classe peut être utile lors de la prise d'une instance d'un objet à une certaine "extras" tels que le remplacement 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:
À l'aide de 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.
overloading methods
et pasoverriding methods
?overload
ou àoverride
la méthode?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, profiter de cette interface:
Vous pouvez l'utiliser de façon anonyme pour créer un la 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:
Et alors vous avez une autre méthode qui retourne le nombre premier plus petit que j'ai dans la liste donnée, ou je si aucun numéro n'est plus petits:
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:
Vous pouvez utiliser une classe anonyme pour utiliser le firstMatch méthode:
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 Le Faire" par Joel lui-même.
Une belle bibliothèque pour la programmation Java dans ce style: Fonctionnel Java.
Anonyme intérieur de la classe est utilisé dans le scénario suivant:
1.)De remplacement(Sous-classement) ,Lors de la définition de la classe n'est pas utilisable, sauf cas actuel:
2.)Pour la mise en œuvre d'une interface,Lors de la mise en œuvre de l'interface est requise uniquement pour les cas en cours:
3.)Argument Défini Anonyme intérieure:
Je les utilise parfois comme une syntaxe hack pour Carte d'instanciation:
vs
Il enregistre une certaine redondance lorsque vous faites beaucoup d'états. Cependant, j'ai également des problèmes lorsque l'extérieur de la classe doit être sérialisé via l'accès distant.
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
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)
myButton.addActionListener(e -> { /* do stuff here */})
oumyButton.addActionListener(stuff)
serait terser.De l'utiliser dans des situations où vous avez besoin de créer une classe pour un but précis à l'intérieur d'une autre fonction, par exemple, en tant qu'auditeur, comme un exécutable (pour frayer un thread), etc.
L'idée est que vous les appelez à partir de l'intérieur du code d'une fonction, de manière à ne jamais se référer à eux d'ailleurs, si vous n'avez pas besoin de les nommer. Le compilateur juste énumère.
Ils sont essentiellement sucre syntaxique, et doit généralement être déplacé ailleurs comme ils grandissent.
Je ne suis pas sûr si c'est l'un des avantages de Java, mais si vous ne les utiliser (et nous avons tous l'utilisent fréquemment, malheureusement), alors on pourrait dire qu'ils sont un.
Lignes directrices pour la Classe Anonyme.
Classe anonyme est déclarée et initialisée simultanément.
Anonyme classe doit étendre ou de mettre en œuvre une et une seule classe ou de l'interface resp.
Comme anonymouse classe n'a pas de nom, il peut être utilisé qu'une seule fois.
par exemple:
ref.getClass().newInstance()
.Oui, les classes internes anonymes est certainement l'un des avantages de Java.
Avec un anonyme intérieur de la classe, vous avez accès à la finale et les variables de membre de l'entourage de la classe, et qui est très pratique auditeurs, etc.
Mais un avantage majeur est que l'intérieur de la classe de code, qui est (au moins devrait être) couplés à l'environnement de la classe/méthode/de blocage, a un contexte particulier (les environs de classe, méthode, et le bloc).
C'est aussi l'un des exemple pour anonyme intérieure type à l'aide de fil
- je utiliser des objets anonymes pour appeler les nouveaux Threads..
Un intérieur de la classe est associé à une instance de l'extérieur de la classe et il y a deux types: classe Locale et La classe anonyme. Une classe anonyme nous permet de déclarer et instancier une classe en même temps, rend donc le code concis. Nous les utilisons lorsque nous avons besoin d'un local de classe qu'une seule fois, car ils n'ont pas un nom.
Prenons l'exemple de doc où nous avons une
Person
classe:et nous avons une méthode pour imprimer les membres qui correspondent à des critères de recherche comme:
où
CheckPerson
est une interface comme:Maintenant, nous pouvons faire usage de l'anonymat de la classe 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 difficile et incertaine.
Java 8 a introduit un terme Interface Fonctionnelle qui est une interface avec une seule méthode abstraite, par conséquent, nous pouvons dire
CheckPerson
est une interface fonctionnelle. Nous pouvons faire usage de Expression Lambda qui nous permet de passer de la fonction comme argument d'une méthode comme:Nous pouvons utiliser une interface fonctionnelle
Predicate
en place de l'interfaceCheckPerson
, ce qui contribuera à réduire la quantité de code nécessaire.Anonyme intérieur de la classe peuvent être bénéfiques, tout en donnant des implémentations différentes pour les différents objets. Mais ils doivent être utilisés avec beaucoup de parcimonie, car cela crée un problème pour le programme de lisibilité.
L'un des principaux de l'utilisation de l'anonymat de classes dans la classe de finalisation, qui a appelé finaliseur tuteur. Dans le monde Java à l'aide de la finaliser méthodes doit être évitée jusqu'à ce que vous avez vraiment besoin d'eux. Vous devez vous rappeler que lorsque vous remplacez la méthode finalize pour les sous-classes, vous devez toujours appeler
super.finalize()
ainsi, parce que la méthode finalize de la super-classe de ne pas invoquer automatiquement et vous pouvez avoir des problèmes avec des fuites de mémoire.si l'on considère le fait mentionné ci-dessus, vous pouvez simplement utiliser l'anonyme classes comme:
À l'aide de cette technique, vous soulagé de vous-même et vos autres développeurs de call
super.finalize()
sur chaque sous-classe de laHeavyClass
qui doit finaliser la méthode.Vous pouvez utiliser la classe anonyme de cette façon
Semble que personne n'a mentionné ici, mais vous pouvez également utiliser la classe anonyme pour tenir argument de type générique (qui normalement perdus en raison du type d'effacement):
Si vous allez instancier cette classe de manière anonyme
puis ces
holder
instance contient des non-erasured définition de type transmis.D'utilisation
Ce qui est très pratique pour la construction de validateurs/deserializators. Aussi, vous pouvez créer une instance de type générique, de réflexion, de (donc si jamais vous voulais faire
new T()
dans paramétrées, tapez - vous êtes les bienvenus!).Inconvénients/Limites
La meilleure façon d'optimiser le code. aussi, Nous pouvons utiliser une méthode de remplacement d'une classe ou d'interface.
Un Anonyme Intérieur de la Classe est utilisé pour créer un objet qui ne sera jamais référencé à nouveau. Il n'a pas de nom et est déclarée et créés dans la même instruction.
Ce est utilisé lorsque vous utilisez normalement un objet variable. Vous remplacez la variable avec le
new
mot-clé, un appel à un constructeur et la définition de la classe à l'intérieur de{
et}
.Lors de l'écriture d'un Programme multi-threadé en Java, il serait normalement ressembler à ceci
La
ThreadClass
utilisé ici serait défini par l'utilisateur. Cette classe permettra de mettre en œuvre laRunnable
interface qui est nécessaire pour créer des threads. Dans leThreadClass
larun()
méthode (seule méthode dansRunnable
) doit être mis en œuvre aussi bien.Il est clair que se débarrasser de
ThreadClass
serait plus efficace et c'est exactement pourquoi les Anonymous Inner Classes existent.Regardez le code suivant
Ce code remplace la référence faite à
task
dans le plus haut exemple. Plutôt que d'avoir une catégorie distincte, de l'Anonyme Intérieur de la Classe à l'intérieur de laThread()
constructeur renvoie un sans nom d'objet qui implémente l'Runnable
interface et remplace larun()
méthode. La méthoderun()
serait inclure des énoncés à l'intérieur que de faire le travail requis par le thread.De répondre à la question de savoir si les Classes internes Anonymes est l'un des avantages de Java, je dois dire que je ne suis pas tout à fait sûr que je ne suis pas familier avec de nombreux langages de programmation en ce moment. Mais ce que je peux dire, c'est qu'il est certainement plus rapide et plus facile la méthode de codage.
Références: Sams Teach Yourself Java en 21 Jours Septième Édition
Un avantage de plus:
Comme vous le savez que Java ne supporte pas l'héritage multiple, donc si vous utilisez le "Thread" un peu de classe en tant que classe anonyme puis la classe a toujours un espace à gauche pour une autre classe pour étendre.