Accéder champ de l'extérieur de la classe
Comment puis-je accéder à un champ de l'extérieur de la classe, compte tenu d'une référence à un objet de l'intérieur de la classe?
class Outer
{
int field;
class Inner
{
void method(Inner parameter)
{
//working on the current instance is easy :)
field = 0;
Outer.this.field = 1;
//working on another instance is hard :(
parameter.field = 2; //does not compile
parameter.Outer.this.field = 3; //does not compile
parameter.outer().field = 4; //This works...
}
//...but I really don't want to have to write this method!
Outer outer()
{
return Outer.this;
}
}
}
J'ai aussi essayé Outer.parameter.field
et beaucoup d'autres variantes. Est-il une syntaxe qui fait ce que je veux?
n'est-ce pas le but d'un intérieur de classe à été utilisé juste à l'intérieur de l'extérieur de la classe?
Je pense que c'est la façon de le faire. Si vous sentez que c'est faux peut-être que vous pouvez penser refactoring ou de la construction de ces classes différemment?
Je ne connais pas d'autre façon de le faire, mais je dirais que si vous êtes d'avoir à faire des contorsions comme ça, cela signifie généralement que vous devez repenser la conception.
Beaucoup de l'intérieur des instances de classe sont passés dans le monde. De nombreux Itérateur classes, par exemple, sont les classes internes de leur objet iterable collections. Les classes internes aider à réduire l'encombrement de l'espace de noms (par exemple,
Je pense que c'est la façon de le faire. Si vous sentez que c'est faux peut-être que vous pouvez penser refactoring ou de la construction de ces classes différemment?
Je ne connais pas d'autre façon de le faire, mais je dirais que si vous êtes d'avoir à faire des contorsions comme ça, cela signifie généralement que vous devez repenser la conception.
Beaucoup de l'intérieur des instances de classe sont passés dans le monde. De nombreux Itérateur classes, par exemple, sont les classes internes de leur objet iterable collections. Les classes internes aider à réduire l'encombrement de l'espace de noms (par exemple,
Float
, Arc2D.Float
, CubicCurve2D.Float
, DataBuffer.Float
, etc.)
OriginalL'auteur fredoverflow | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons de regarder ce que vous faites, comme une méthode statique ou non méthode statique.
Au premier coup d'œil, votre exemple, ressemble plus à une méthode statique, car il est de manipuler l'état du paramètre plutôt qu'à son propre état. Le problème statique a été avant, par exemple, voir En Java, comment puis-je accéder à l'extérieur de la classe quand je ne suis pas dans l'intérieur de la classe?
Mais votre exemple est d'un non méthode statique, et je crois que je vois ce que vous obtenez et pourquoi vous pensez qu'une référence externe doit être possible. Après tout, il existe d'autres situations dans lesquelles vous pouvez accéder aux détails de mise en œuvre des autres instances de votre propre type, par exemple, il est commun de référence le paramètre d'entrée privée champs des membres lors de la substitution d'égal à égal. Malheureusement, je ne pense pas que java fournit un moyen de se référer à un autre lexicalement enfermant instance. Ce qui a probablement quelque chose à voir avec la façon dont java en fait met en œuvre non-statique à l'intérieur des classes. Java utilise
this$0
pour ses propres fins, mais vous n'avez pas accès à ce terrain synthétique.OriginalL'auteur jtoberon
Comment au sujet de cette solution:
field
quand c'est un Objet plutôt qu'un primitif, qui est le principal avantage de cette approche.OriginalL'auteur user1504714
De l'extérieur de l'intérieur de la classe, je crois qu'il n'y a aucun moyen, compte tenu d'une référence à un intérieur instance de classe, pour faire référence à des membres de l'extérieur de la classe de l'instance. À partir de l'intérieur d'un non-statique à l'intérieur de la classe, vous pouvez, bien sûr, référence à eux à l'aide de la
Outer.this.*
syntaxe.Pensez-y de cette façon: l'intérieur de la classe est en fait une classe complètement distincte. Il a un générées par le compilateur champ (généralement nommé quelque chose de bizarre comme
this$0
). Dans l'intérieur de la classe, la langue vous permet de référencer que des champs à l'aideOuter.this
; toutefois, sucre syntaxique n'est pas disponible à l'extérieur de l'intérieur de la classe elle-même. Ni est généré par le compilateur champ.OriginalL'auteur Ted Hopp