2011-10-12 2 views
44

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é?

+7

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) –

+0

@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. –

+0

@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 –

Répondre

70

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 or protected .

+4

citation: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –

+0

@Ryan Stewart: Merci d'avoir trouvé cela. – ColinD

2

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

+0

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

+0

"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

+0

@ raghavsood33 oui vous pouvez. Voir le code compilable que j'ai ajouté à ma réponse qui montre un constructeur paquet-visible. – Bohemian

Questions connexes