java-私有枚举constru

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;
    }
}
pushya asked 2020-01-14T12:04:30Z
8个解决方案
48 votes

私有构造函数仅允许从类定义中构造对象。 作为枚举,很容易混淆,因此我通常会更容易将枚举视为具有某些特殊功能的类。 所以当你写:

SLocale.EN_US

基本上,参数

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

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

Dhruv Gairola answered 2020-01-14T12:04:58Z
45 votes

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

注意:枚举类型的构造函数必须是package-private或   私人访问。 它会自动创建以下常量   在枚举主体的开头定义。 您不能调用枚举   自己构造。

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

Beez answered 2020-01-14T12:05:27Z
9 votes

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

Jérôme Verstrynge answered 2020-01-14T12:05:47Z
5 votes

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

Oscar Gomez answered 2020-01-14T12:06:09Z
3 votes

这意味着除枚举“类”本身外,没有其他代码能够显式构造枚举对象

beefyhalo answered 2020-01-14T12:06:29Z
3 votes

对于枚举,这意味着将其打包为私有。 实例化枚举的唯一方法是在枚举类中声明它们。 枚举不能具有公共构造函数。

Jeremy answered 2020-01-14T12:06:49Z
2 votes
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[]) {

    }

}

输出:Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)

想象一下如下的枚举:

Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)等效于static final Day TUESDAY = new Day(2);

Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)也等同于static final Day TUESDAY = new Day(2);

Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)等效于static final Day TUESDAY = new Day(2);

由于枚举必须被视为一种特殊的类,因此它允许使用“静态”对象创建。 由于您无法在enum类之外进行对象创建,因此所有对象创建都发生在类声明级别本身,因此此处的“静态”对象创建是有意义的。

在Enum中,所有对象的创建(准确地说就是静态最终常量的创建)都必须在该枚举类本身(以及私有构造函数)中进行,因为Enum的目的是仅具有一组固定的有意义的常量, 尊重您的应用程序,并消除无意义的声明/实例,例如Day SOME_EIGHTH_DAY_THINKING_TO_BE_VALID = new Day(8)

user104309 answered 2020-01-14T12:07:36Z
0 votes

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

Harsha answered 2020-01-14T12:07:57Z
translate from https://stackoverflow.com:/questions/7113363/private-enum-constructor