此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;
}
}
答案 0 :(得分:45)
来自:http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
注意:枚举类型的构造函数必须是package-private或 私人访问。它会自动创建常量 在枚举体的开头定义。你不能调用枚举 构建者自己。
您实际上不能拥有公共枚举构造函数。
答案 1 :(得分:45)
私有构造函数只允许在类定义中构造对象。作为一个枚举,它很容易混淆,所以我通常会发现将枚举视为具有一些特殊功能的类更容易。所以当你写:
SLocale.EN_US
基本上是参数
Locale.US, "www.abc.com", "www.edc.com", "www.vvv.com", "www.earn.com"
将传递给私有构造函数,以便可以实例化枚举。 Enum构造函数必须是私有的。
答案 2 :(得分:9)
您需要此构造函数是私有的,因为枚举定义了一组有限的值(例如EN_US,EN_UK,FR_FR,FR_BE)。如果构造函数是公共的,则可能会创建更多值(例如,无效/未声明的值,例如XX_KK等)。这将扩展最初声明的值集。
答案 3 :(得分:5)
Enums必须具有专用私有构造函数,这是因为Enum应该是唯一负责返回预定义实例的人。
答案 4 :(得分:3)
对于枚举,它意味着将其打包为私有。实例化枚举的唯一方法是在枚举类中声明它们。枚举不能有公共构造函数。
答案 5 :(得分:3)
这意味着除了枚举“class”本身之外的任何代码都不能显式构造枚举对象
答案 6 :(得分:2)
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
TUESDAY(2)
相当于static final Day TUESDAY = new Day(2);
因为enum必须被认为是一种特殊类型的类,所以它允许&#34;静态&#34;宾语 创建。由于您无法在枚举类之外进行对象创建,因此所有对象创建都发生在类声明级别本身,因此&#34;静态&#34;对象创建在这里是有意义的。
在Enum中,所有对象创建(即,静态的最终常量创建,确切地说)必须从该枚举类本身(因此私有构造函数)中发生,因为Enum的目的是仅具有固定的一组有关您的应用程序的有意义的常量,并消除无意义的语句/实例,如Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)
答案 7 :(得分:0)
我会认为Enums是单身,因此构造函数必须是私有的,如果它们不是单身,那么想想一切都会出错。当你声明一个构造函数时,你正在实现java的最终静态行为。你可以只宣传一次。这种impl来自属性文件或cfg文件,需要在应用程序启动时加载一次。 nromal枚举和常量的问题是你必须改变java代码,并需要重新编译。但如果您从文件加载然后我们可以更改它并重新启动,更改将生效。希望我对此有所了解。