web-dev-qa-db-fra.com

Constructeur enum privé

Le constructeur de cette enum est privé. Qu'est-ce que ça veut dire? 

public enum SLocale {

    EN_US(Locale.US, "www.abc.com", "www.edc.com", "www.vvv.com",
            "www.earn.com");

    List<String> domains;
    Locale loc;
    IMap map;

    private SLocale(Locale loc, String... domains) {
        this.domains = Arrays.asList(domains);
        this.loc = loc;
        this.siteMap = Factory.getMap(loc);
    }

    public List<String> getDomains() {
        return domains;
    }

    public Locale getLoc() {
        return loc;
    }

    public ISiteMap getMap() {
        return map;
    }
}
45
pushya

Un constructeur privé permet uniquement de construire des objets à partir de la définition de classe. Étant une énumération, il est facile d’être embrouillé. Il m’est donc généralement plus facile de penser à une énumération en tant que classe présentant certaines caractéristiques spéciales. Alors quand tu écris:

SLocale.EN_US

Fondamentalement, les paramètres 

Locale.US, "www.abc.com", "www.edc.com", "www.vvv.com", "www.earn.com"

sera passé au constructeur privé afin que l'énumération puisse être instanciée. Les constructeurs d'énumérés doivent être privés.

43
Dhruv Gairola

De: http://download.Oracle.com/javase/tutorial/Java/javaOO/enum.html

Remarque: Le constructeur d'un type enum doit être package-private ou accès privé. Il crée automatiquement les constantes qui sont défini au début du corps de l'énum. Vous ne pouvez pas invoquer une énumération constructeur vous-même.

Vous ne pouvez pas réellement avoir un constructeur d'enum public.

44
Beez

Ce constructeur doit être privé, car les enums définissent un ensemble fini de valeurs (par exemple, EN_US, EN_UK, FR_FR, FR_BE). Si le constructeur était public, les personnes pourraient potentiellement créer plus de valeurs (par exemple, des valeurs non valides/non déclarées telles que XX_KK, etc.). Cela élargirait l'ensemble des valeurs déclarées initialement.

8
Jérôme Verstrynge

Les énumérations doivent obligatoirement avoir des constructeurs exclusivement privés. Enum doit être le seul responsable du renvoi des instances prédéfinies.

5
Oscar Gomez

Dans le cas des enums, cela signifie la même chose que de rendre le paquet privé. Le seul moyen d'instancier une énumération est de les déclarer dans votre classe enum. Les enums ne peuvent pas avoir de constructeurs publics.

3
Jeremy

Cela signifie qu'aucun code autre que l'énum "classe" elle-même n'est capable de construire explicitement un objet enum

3
beefyhalo
public enum Day {

    SUNDAY(), MONDAY, TUESDAY(2), WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;

    int value;

    private Day(int value) {
        System.out.println("arg cons");
        this.value = value;
    }

    private Day() {
        System.out.println("no arg cons");
    }

    public static void main(String args[]) {

    }

}

Sortie: no arg cons no arg cons arg cons no arg cons no arg cons no arg cons no arg cons

Imaginez enum comme suit:

SUNDAY() est équivalent à static final Day SUNDAY = new Day();

MONDAY est également équivalent à static final Day MONDAY = new Day(); // without paranthesis it calls the no-arg constructor/default no-arg constrctor if no other constructor

TUESDAY(2) est équivalent à static final Day TUESDAY = new Day(2);

Comme enum doit être considéré comme un type spécial de classe, il permet la création "statique" d'objet Etant donné que vous ne pouvez pas créer d'objets en dehors de la classe enum, toutes les créations d'objets se font au niveau de la déclaration de classe elle-même et, par conséquent, "statique" pour la création d'objets a un sens ici.

Dans Enum, toutes les créations d'objet (c'est-à-dire les créations statiques finales constantes, pour être précis) doivent avoir lieu à l'intérieur de la classe d'énum elle-même (et donc du constructeur privé), car son but est de n'avoir qu'un ensemble fixe de constantes significatives avec respectez votre application et éliminez les déclarations/instanciations dénuées de sens telles que Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)

2
user104309

Je penserais à Enums en tant que singleton et, par conséquent, les constructeurs doivent être privés. S'ils ne le sont pas, pensez à ce qui va mal se passer. Lorsque vous déclarez un constructeur, vous implémentez le comportement statique final de Java. vous ne pouvez initier qu'une seule fois. ce type d'impl est sorti du fichier de propriétés ou des fichiers cfg qui doivent être chargés une fois au début de l'application. Le problème avec les énumérations et les constantes nromal est que vous devez modifier le code Java et que vous avez besoin d’une recompilation. mais si vous chargez depuis un fichier, nous pouvons le changer et le redémarrer, les changements prendront effet. J'espère avoir jeté plus de lumière à ce sujet.

0
Harsha