web-dev-qa-db-fra.com

Pourquoi les constructeurs enum ne peuvent-ils pas être protégés ou publics en Java?

Toute la question est dans le titre. Par exemple:

enum enumTest {

        TYPE1(4.5, "string1"), TYPE2(2.79, "string2");
        double num;
        String st;

        enumTest(double num, String st) {
            this.num = num;
            this.st = st;
        }
    }

Le constructeur convient bien avec le modificateur par défaut ou private, mais me donne une erreur de compilation si les modificateurs public ou protected sont fournis.

65
Bad Request

Considérez Enums comme une classe avec un nombre fini d'instances. Il ne peut y avoir aucune instance différente de celles que vous déclarez initialement.

Ainsi, vous ne pouvez pas avoir de constructeur public ou protégé, car cela permettrait de créer plus d'instances.

Remarque: ce n'est probablement pas la raison officielle. Mais il est plus logique que je pense à enums de cette façon.

86
jjnguy

Parce que vous ne pouvez pas appeler le constructeur vous-même.

Voici ce que les tutoriels sur Enums ont à dire:

Remarque: Le constructeur d'un type enum doit être un accès privé à un paquet ou privé. Il crée automatiquement les constantes définies au début du corps enum. Vous ne pouvez pas invoquer vous-même un constructeur d’énumération. 

17
Cristian Sanchez

Les énumérations contiennent un ensemble fixe de valeurs, qui doivent toutes être connues lors de la compilation. Cela n'a pas de sens de créer de nouveaux littéraux au moment de l'exécution, ce qui serait possible si le constructeur était visible.

8
harto

En effet, enum est que Java contient des valeurs constantes fixes. Il est donc inutile d'avoir un constructeur public ou protégé car vous ne pouvez pas créer d'instance d'enum.

De plus, notez qu’en interne, enum est converti en classe comme ci-dessous.

enum Color {
 RED, BLUE, YELLOW;
}

Cela sera converti en interne en:

public final class Color {
 private Color() {}
 public static final Color RED = new Color();
 public static final Color BLUE = new Color();
 public static final Color YELLOW = new Color();
}

Ainsi, chaque constante enum est représentée sous la forme d'un objet de type enum. Comme nous ne pouvons pas créer explicitement d'objets enum, nous ne pouvons donc pas appeler directement le constructeur enum.

0
Praveen Kishor