Java 私有枚举构造函数

Java 私有枚举构造函数,java,enums,Java,Enums,此枚举的构造函数是私有的。这是什么意思 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... domain

枚举的构造函数是私有的。这是什么意思

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;
    }
}
public enum SLocale{
EN_US(Locale.US,“www.abc.com”,“www.edc.com”,“www.vvv.com”,
“www.earn.com”);
列出域名;
地点loc;
IMap地图;
专用SLocale(区域设置loc、字符串…域){
this.domains=Arrays.asList(域);
this.loc=loc;
this.siteMap=Factory.getMap(loc);
}
公共列表getDomains(){
返回域;
}
公共语言环境getLoc(){
返回loc;
}
公共ISiteMap getMap(){
返回图;
}
}

对于枚举,它的意思与将其包私有化相同。实例化枚举的唯一方法是在枚举类中声明它们。枚举不能有公共构造函数。

这意味着除了枚举“类”本身之外,任何代码都不能从以下位置显式构造枚举对象:

注意:枚举类型的构造函数必须是包私有或 私人访问。它会自动创建以下常量: 在枚举正文的开头定义。不能调用枚举 你自己


实际上不能有公共枚举构造函数。

枚举必须有专用的专用构造函数,这是因为枚举应该是唯一负责返回预定义实例的构造函数。

专用构造函数只允许从类定义中构造对象。作为一个枚举,很容易混淆,所以我通常认为枚举是一个具有一些特殊特性的类更容易理解。所以当你写作时:

SLocale.EN_US
基本上,参数

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

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

您需要此构造函数是私有的,因为枚举定义了一组有限的值(例如EN_-US、EN_-UK、FR_-FR、FR_-be)。如果构造函数是公共的,人们可能会创建更多的值(例如无效/未声明的值,如XX_KK等)。这将扩展最初声明的值集。

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

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[]) {

    }

}
输出:

无arg-cons
无arg-cons
arg-cons
无arg-cons
无arg-cons
无arg-cons
无arg cons

将enum想象为如下所示:

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

MONDAY
也相当于
static final Day MONDAY=new Day();//如果没有其他构造函数,它将调用无参数构造函数/默认无参数构造函数

星期二(2)
相当于
静态最后一天星期二=新的一天(2)

因为枚举必须被视为一种特殊类型的类,所以它允许“静态”对象 创造由于不能在枚举类之外创建对象,因此所有对象创建都发生在类声明级别本身,因此在这里创建对象的“静态”是有意义的


在Enum中,所有对象创建(准确地说,是静态最终常量创建)都必须在该Enum类本身(以及私有构造函数)中进行因为Enum的目的是针对您的应用程序只拥有一组固定的有意义的常量,并消除无意义的语句/实例化,如
Day SOME\u第八天\u THINKING\u to\u BE\u VALID=new Day(8)

如果您不使用“private”,编译器会为您添加它。您可以编译带有和不带“private”的代码,并对两个类文件执行“diff”;它们是相同的。您还可以在enum类上执行“javap-p-c”来比较。。。构造函数总是私有的。它也写在规范中:“在枚举声明中,没有访问修饰符的构造函数声明是私有的。”(参见)哇,我见过的最简单、最不容易混淆的枚举解释。我终于明白了,“当你写的时候……参数……会被传递给构造函数”。请注意,当我们写SLocale.EN_US时,参数不会传递给构造函数,因为所有枚举常量都是静态的,这意味着,即使我们不写SLocale.EN_US,在类加载时,construcor仍然会被调用。我认为,枚举常量必须在枚举类型内硬编码。我们无法从文件中加载它们。你能分享一些代码来证明你的说法吗。