[英]Private enum constructor
此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"
将被传递给私有构造函数,以便实例化枚举。 Enum构造函数必须是私有的。
来自: http : //download.oracle.com/javase/tutorial/java/javaOO/enum.html
注意:枚举类型的构造函数必须是包私有或私有访问。 它会自动创建在枚举主体开头定义的常量。 您不能自己调用枚举构造函数。
你实际上不能有一个公共枚举构造函数。
您需要此构造函数是私有的,因为枚举定义了一组有限的值(例如EN_US,EN_UK,FR_FR,FR_BE)。 如果构造函数是公共的,则可能会创建更多值(例如,无效/未声明的值,例如XX_KK等)。 这将扩展最初声明的值的集合。
Enum必须具有专用的私有构造函数,这是因为Enum应该是唯一负责返回预定义实例的人。
在枚举的情况下,它意味着将其打包为私有。 实例化枚举的唯一方法是在枚举类中声明它们。 枚举不能有公共构造函数。
这意味着除了枚举“class”本身之外的任何代码都不能显式构造枚举对象
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);
由于枚举必须被视为特殊类型的类,因此它允许创建“静态”对象。 由于你不能在枚举类之外进行对象创建,所有对象创建都发生在类声明级别本身,因此对象创建的“静态”在这里是有意义的。
在Enum中,所有对象创建(即,静态的最终常量创建,确切地说)必须从该枚举类本身(因此私有构造函数)中发生,因为Enum的目的是仅具有一组固定的有意义的常量尊重您的申请并消除Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)
陈述/实例,如Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)
我会认为Enums是单身,因此构造函数必须是私有的,如果它们不是单身,那么想想一切都会出错。 当你声明一个构造函数时,你正在实现java的最终静态行为。 你可以只宣传一次。 这种impl来自属性文件或cfg文件,需要在应用程序启动时加载一次。 nromal枚举和常量的问题是你必须改变java代码,并需要重新编译。 但如果您从文件加载然后我们可以更改它并重新启动,更改将生效。 希望我对此有所了解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.