私有枚举的构造函数

这个enum的构造函数是私有的。 那是什么意思?

 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; } } 

私有构造函数只允许在类定义中构造对象。 作为一个枚举,很容易混淆,所以我通常觉得把枚举看作一个具有特殊特征的类是比较容易的。 所以当你写:

 SLocale.EN_US 

基本上,参数

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

将被传递给私有构造函数,以便枚举可以被实例化。 枚举构造函数必须是私有的。

来自: http : //download.oracle.com/javase/tutorial/java/javaOO/enum.html

注意:枚举types的构造函数必须是包私有或私有访问。 它会自动创build在枚举正文开头定义的常量。 你不能自己调用​​一个枚举构造函数。

你实际上不能有一个公共的枚举构造函数。

你需要这个构造函数是私有的,因为枚举定义了一组有限的值(例如EN_US,EN_UK,FR_FR,FR_BE)。 如果构造函数是公开的,人们可能会创build更多的值(例如无效/未声明的值,如XX_KK等)。 这将扩展最初声明的值的集合。

枚举要求只有私有的构造函数,这是因为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[]) { } } 

输出: no arg cons no arg cons arg cons no arg cons no arg cons no arg cons no arg cons

想象一下枚举如下:

SUNDAY()相当于static final Day SUNDAY = new Day();

MONDAY也相当于static final Day MONDAY = new Day(); // without paranthesis it calls the no-arg constructor/default no-arg constrctor if no other constructor static final Day MONDAY = new Day(); // without paranthesis it calls the no-arg constructor/default no-arg constrctor if no other constructor

TUESDAY(2)相当于static final Day TUESDAY = new Day(2);

由于枚举必须被认为是一种特殊的类,它允许“静态”的对象创build。 既然你不能在enum类之外做对象创build,所有的对象创build都是在类声明级别本身发生的,因此对象创build的“静态”在这里是有意义的。

在枚举中,所有的对象创build(即静态最终常量创build)必须从该枚举类本身(也就是私有构造函数)中进行,因为枚举的目的是只有一组固定的有意义的常量尊重您的应用程序,并消除像Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)这样的Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)语句/实例。

我想将枚举看成是单例,因此构造函数必须是私有的,如果他们不是单身人士,那么就会想到什么都会出问题。 当你声明一个构造函数,那么你正在实现java的最终静态行为。 你只能启动一次。 这种impl出来的属性文件或cfg文件,需要在应用程序的开始加载一次。 nromal枚举和常量的问题是你必须改变java代码,并且需要重新编译。 但是如果你是从文件加载,那么我们可以改变它并重新启动,更改将生效。 希望我对此有更多的了解。