繁体   English   中英

私有枚举构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM