Pourquoi avoir une classe statique publique à l'intérieur d'une classe
J'ai été en passant par un peu de code et j'ai vu ceci:
public class A {
public A(SomeObject obj) {
//Do something
}
//Some stuff
public static class B {
//Some other stuff
}
}
Je me demandais depuis même à l'intérieur de la classe est public
pourquoi l'avoir comme imbriquées et non pas une catégorie distincte?
Aussi, puis-je le faire ici: new A.B(SomeObject)
? Je sens cela va à l'encontre de l'objectif d'une classe statique, mais j'ai vu cette mise en œuvre ainsi donc voulu savoir.
source d'informationauteur noMAD
Vous devez vous connecter pour publier un commentaire.
C'est vraiment une question à poser à celui qui a écrit la classe. Il peut permettre l'extérieur de la classe pour agir comme un "mini-espace de noms" - si la classe imbriquée est seulement utile dans le contexte de l'extérieur de la classe, il semble raisonnable. Il indique délibérée de couplage étroit entre les deux classes. J'ai le plus souvent voir ce dans le contexte du générateur de modèle:
Ici, il fait sens pour moi d'avoir
Foo.Builder
imbriquée dansFoo
plutôt que comme un des pairs de la classe qui sera probablement appeléFooBuilder
.Remarque que cela donne aussi de la visibilité des différences en comparaison avec seulement les classes indépendantes.
Non, parce que
B
n'a pas de constructeur avec uneSomeObject
paramètre uniquementA
(dans l'exemple que vous avez donné).Vous devriez essayer de travailler sur exactement que ce que vous estimez le but d'une classe statique, et de quelle manière cela va à l'encontre de cet objectif. Actuellement, c'est trop vague, une déclaration qui sera discuté de façon réaliste.
Vous auriez un à l'intérieur de la classe, comme cela, afin
private
membres de l'extérieur de la classe ou d'autres classes imbriquées.Lock
ouSync
qui vous ne voulez pas être mélangé avec d'autres classes du même nom utilisé par les classes du même package.Vous le pouvez.
Il faut s'y habituer, mais une fois que vous commencez, vous pouvez avoir de la difficulté à ne pas transformer l'ensemble de votre programme dans un file.java 😉
1. Un
static inner
la classe est connue commeTop-Level
Classe.2. Cette
static class
a accès direct à l'Extérieur de la classe méthode Statique et variables.3. Vous devez initialiser la
static Inner class
de cette façon, à partir de l'Extérieur...4.
new A.B(SomeObject)
ne fonctionne pas... parce que vous n'ont pas un constructeur avecSomeObject
comme paramètre...5. Mais quand l'Intérieur de la classe est Non statique, puis il ont des références implicites à l'Extérieur de la classe.
6. L'intérieur et l'extérieur de la classe peut s'étend à différentes classes.
7. Un
interface's method
peut être mis en œuvre plus d'une fois de différentes ou de la même façon, en utilisant Intérieure.Ce modèle est très souvent utilisé avec le générateur de modèle. Non seulement il fait clairement la relation entre une classe et son créateur, mais aussi cacher le vilain constructeur constructeur/l'usine et le fait générateur plus lisible. Par exemple, dans le cas où vous avez besoin de votre objet construit à option et pas une option propriétés.
De cette façon, le code du client d'appeler d'abord la méthode statique sur le
AnObjectBuilder
classe, puis utiliser l'option builder méthodes:AnObject.fooObject("foo").withSomeOptionalField("xxx").build();
sans créer le constructeur de l'objet.Assez lisible 🙂
Je me demandais depuis même à l'intérieur de la classe publique est pourquoi il imbriquée et non pas une catégorie distincte?
Avoir un oeil sur ce thread: Pourquoi étrange convention de nommage de "AlertDialog.Builder" au lieu de "AlertDialogBuilder" dans Android
Aussi, puis-je le faire ici: new A. B(SomeObject) ?
(Mise à jour) Non, vous ne pouvez pas faire cela, car B n'a pas un constructeur qui demande SomeObject.
J'espère que cette aide.
La simple raison qu'il est permis d'emballage de commodité.
Statique de la classe imbriquée dans Java, pourquoi?
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
oui, vous pouvez faire de nouveaux
A.B(SomeObject)
. Mais vous n'avez pas à prendre mon mot pour lui, l'essayer.