私有枚举构造函数

时间:2011-08-18 19:58:32

标签: java enums

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

8 个答案:

答案 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代码,并需要重新编译。但如果您从文件加载然后我们可以更改它并重新启动,更改将生效。希望我对此有所了解。