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;
}
}
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.
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.
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.
Les énumérations doivent obligatoirement avoir des constructeurs exclusivement privés. Enum doit être le seul responsable du renvoi des instances prédéfinies.
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.
Cela signifie qu'aucun code autre que l'énum "classe" elle-même n'est capable de construire explicitement un objet enum
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)
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.