Puisqu'un constructeur enum ne peut être invoqué que par ses constantes, pourquoi est-il alors autorisé à être paquet-privé?Pourquoi une énumération possède-t-elle un constructeur paquet-privé?
Répondre
Le constructeur n'est en fait pas paquet-privé ... c'est implicitement private
la façon dont les méthodes d'interface sont implicitement public
même si vous n'ajoutez pas le mot-clé.
La section pertinente du JLS (§8.8.3) déclare:
If no access modifier is specified for the constructor of a normal class, the constructor has default access.
If no access modifier is specified for the constructor of an enum type, the constructor is
private
.It is a compile-time error if the constructor of an enum type (§8.9) is declared
public
orprotected
.
citation: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –
@Ryan Stewart: Merci d'avoir trouvé cela. – ColinD
Il est une bizarrerie de la langue: les constructeurs de ENUM sont implicitement privés.
Fait intéressant, si vous déclarez un constructeur enum package visible, comme ceci:
public enum MyEnum {
A(0),
B(1);
private final int i;
MyEnum(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
vous ne pouvez pas s'y référer d'une autre classe dans le package. Si vous essayez, vous obtenez l'erreur du compilateur:
Cannot instantiate the type MyEnum
Apparemment, vous pouvez essayer ceci avec enum étant une classe imbriquée statique ou une méthode de l'énumération. Oui, la compilation échoue avec cette erreur. – Vlasec
"si vous déclarez un constructeur enum visible par le paquet" ... mais en réalité il n'y a aucun moyen de le faire. – raghavsood33
@ raghavsood33 oui vous pouvez. Voir le code compilable que j'ai ajouté à ma réponse qui montre un constructeur paquet-visible. – Bohemian
- 1. Remplacement d'une énumération qui nécessite une traduction et un énumération
- 2. Comment utilisez-vous une énumération avec une autre énumération?
- 3. # définir dans une énumération ou comment étendre une énumération
- 4. Pourquoi ajouter un constructeur CodeIgniter produisant une erreur 500
- 5. Pourquoi shared_ptr a un constructeur explicite
- 6. Comment mapper une valeur en une énumération?
- 7. Sérialiser une énumération à un attribut XML
- 8. Énumération dans un JSP
- 9. Pourquoi mettre une fonction constructeur directement dans une variable?
- 10. Accéder à une énumération stockée dans un QVariant
- 11. Surcharge Scala Énumération Valeur
- 12. Hibernate Projections.sum() sur une énumération
- 13. Énumérer dans une autre énumération
- 14. Pourquoi devrais-je avoir une énumération déclarée avec un typedef en C++?
- 15. Pourquoi la conversion d'une énumération stockée dans un objet en int renvoie-t-elle une chaîne?
- 16. EntityName énumération
- 17. Définir une énumération en utilisant un int spécifique à cette énumération?
- 18. Accéder à une énumération dans un espace de nom différent
- 19. Pourquoi ce constructeur est appelé?
- 20. Liaison DropDownList à une énumération
- 21. Comment créer une énumération globale
- 22. Inverser une énumération dans VB.NET
- 23. Pourquoi ne puis-je pas activer une classe avec une seule conversion implicite en une énumération?
- 24. Énumération rapide sur un NSIndexSet
- 25. Un constructeur appelant typique d'un autre constructeur, mais me donne une erreur
- 26. Remplacer constructeur avec une usine/ou un constructeur
- 27. Pourquoi constructeur avec arg indéfinit le constructeur defualt?
- 28. constructeur C++ appeler un autre constructeur
- 29. Méthodes d'extension IEnumerable sur une énumération
- 30. Liaison directe d'un TypeConverter à une énumération
pour permettre d'économiser un peu sur l'espace de code et d'éviter verbosité inutiles (comme les interfaces ne ont pas besoin 'abstract' public avant chaque méthode) –
@ratchetfreak: Il est pas comme les interfaces. Les méthodes d'interface sont * toujours * 'abstract abstract'. Rendre les modificateurs explicites est autorisé, mais il n'y a aucun moyen de les changer. –
@RyanStewart il n'y a pas moyen d'appeler vous-même un constructeur enum pour qu'il devienne logiquement privé et permettre package privé permet d'enregistrer ces quelques caractères –