私有枚举构造函数

pus*_*hya 53 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dhr*_*ola 49

私有构造函数只允许在类定义中构造对象.作为一个枚举,它很容易混淆,所以我通常会发现将枚举视为具有一些特殊功能的类更容易.所以当你写:

SLocale.EN_US
Run Code Online (Sandbox Code Playgroud)

基本上是参数

Locale.US, "www.abc.com", "www.edc.com", "www.vvv.com", "www.earn.com"
Run Code Online (Sandbox Code Playgroud)

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

  • “当你写......参数......将被传递给构造函数”。请注意,在我们编写 SLocale.EN_US 时并没有将参数传递给构造函数,因为所有枚举常量都是静态的,这意味着,即使我们不编写 SLocale.EN_US,在类加载时仍然会调用构造函数。 (2认同)

Bee*_*eez 46

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

注意:枚举类型的构造函数必须是包私有或私有访问.它会自动创建在枚举主体开头定义的常量.您不能自己调用​​枚举构造函数.

你实际上不能有一个公共枚举构造函数.

  • 如果您不使用"私有",则编译器会为您添加它.您可以使用和不使用"private"编译代码,并在两个类文件上执行"diff"; 他们是相同的.您还可以在枚举类上执行"javap -p -c"进行比较......构造函数始终是私有的. (28认同)
  • 它也写在规范中:*"在枚举声明中,没有访问修饰符的构造函数声明是私有的."*(参见[jls-8.9.2](https://docs.oracle.com/javase/specs /jls/se8/html/jls-8.html#jls-8.9.2)) (9认同)

Jér*_*nge 9

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


Osc*_*mez 5

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