Est-il possible de passer des paramètres ou d'accéder à des paramètres externes à une classe anonyme? Par exemple:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
Existe-t-il un moyen pour l'écouteur d'accéder à myVariable ou de se faire passer myVariable sans créer l'écouteur en tant que classe nommée réelle?
java
anonymous-class
Lewis
la source
la source
final
des variables locales à partir de la méthode englobante.this
.Réponses:
Techniquement, non, car les classes anonymes ne peuvent pas avoir de constructeur.
Cependant, les classes peuvent référencer des variables à partir d'étendues contenant. Pour une classe anonyme, il peut s'agir de variables d'instance de la ou des classes contenant ou de variables locales marquées comme finales.
edit : Comme l'a souligné Peter, vous pouvez également passer des paramètres au constructeur de la superclasse de la classe anonyme.
la source
new ArrayList(10) { }
super()
et avant le reste du constructeur réel.new someclass(){ fields; {initializer} fields; methods(){} }
. C'est un peu comme un initialiseur statique mais sans le mot clé static. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6Oui, en ajoutant une méthode d'initialisation qui renvoie 'this', et en appelant immédiatement cette méthode:
Aucune déclaration «finale» nécessaire.
la source
final
objet de référence juste pour pouvoir obtenir des informations dans mes classes anonymes. Merci pour le partage!init()
fonction doit-elle revenirthis
? Je ne comprends pas vraiment la syntaxe.Oui. vous pouvez capturer la variable, visible par la classe interne. la seule limitation est qu'il doit être définitif
la source
this
ce qui est final.final
? Je ne trouve aucune alternative. Cela peut influencer le paramètre d'origine qui est censé êtrefinal
.Comme ça:
la source
Cela fera la magie
la source
Comme indiqué sur http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class, vous pouvez ajouter un initialiseur d'instance. C'est un bloc qui n'a pas de nom et qui est exécuté en premier (tout comme un constructeur).
On dirait qu'ils sont également abordés dans Pourquoi les initialiseurs d'instance Java? et En quoi un initialiseur d'instance est-il différent d'un constructeur? discute des différences par rapport aux constructeurs.
la source
final
variables comme décrit par aav, mais cette information n'a pas été fournie dans cette réponse. De loin, la meilleure réponse est celle donnée par Adam Mlodzinksi (j'utilise maintenant ce modèle exclusivement, plus de finales!). Je maintiens mon commentaire selon lequel cela ne répond pas à la question posée.Ma solution consiste à utiliser une méthode qui retourne la classe anonyme implémentée. Des arguments réguliers peuvent être passés à la méthode et sont disponibles dans la classe anonyme.
Par exemple: (à partir d'un code GWT pour gérer un changement de zone de texte):
Pour cet exemple, la nouvelle méthode de classe anonyme serait référencée avec:
OU , en utilisant les exigences du PO:
la source
D'autres personnes ont déjà répondu que les classes anonymes ne peuvent accéder qu'aux variables finales. Mais ils laissent la question ouverte de savoir comment garder la variable d'origine non définitive. Adam Mlodzinski a donné une solution mais c'est assez gonflé. Il existe une solution beaucoup plus simple au problème:
Si vous ne voulez
myVariable
pas être définitif, vous devez l'envelopper dans une nouvelle portée où cela n'a pas d'importance, si elle est définitive.Adam Mlodzinski ne fait rien d'autre dans sa réponse mais avec beaucoup plus de code.
la source
init
méthode. Je peux ajouter une ligne de code supplémentaire à mon exemple afin d'avoir cette variable supplémentaire. Si vous êtes un grand fan des modèles de construction, n'hésitez pas à les utiliser, mais ils ne sont pas nécessaires dans ce cas.final
une solution variable.Vous pouvez utiliser des lambdas simples ("les expressions lambda peuvent capturer des variables")
ou même une fonction
Utiliser Function est un excellent moyen de refactoriser les décorateurs et les adaptateurs, voir ici
Je viens de commencer à en apprendre davantage sur les lambdas, donc si vous repérez une erreur, n'hésitez pas à écrire un commentaire.
la source
Un moyen simple de mettre de la valeur dans une variable externe (n'appartient pas à la classe anonymus) est de savoir comment suivre!
De la même manière, si vous voulez obtenir la valeur d'une variable externe, vous pouvez créer une méthode qui retourne ce que vous voulez!
la source
Je pensais que les classes anonymes étaient fondamentalement comme des lambdas mais avec une syntaxe pire ... cela s'avère être vrai mais la syntaxe est encore pire et provoque (ce qui devrait être) des variables locales à saigner dans la classe contenant.
Vous ne pouvez accéder à aucune variable finale en les transformant en champs de la classe parent.
Par exemple
Interface:
classe:
Je ne sais pas s'ils ont réglé cela en java 8 (je suis coincé dans le monde EE et je n'ai pas encore 8) mais en C #, cela ressemblerait à ceci:
Vous n'avez pas non plus besoin d'une interface séparée en c # ... ça me manque! Je me surprends à faire de pires conceptions en java et à me répéter davantage parce que la quantité de code + la complexité que vous devez ajouter en java pour réutiliser quelque chose est pire que de simplement copier et coller la plupart du temps.
la source