会在每次调用对象名称作为值的枚举时创建一个对象吗?

时间:2018-11-22 07:02:42

标签: java enums

这引起了我的关注,主要是因为:

public enum Method {
    POST(new Host().getAssets()),
    GET("GET"),
    DELETE("DELETE"),
    PUT("PUT");

    private String method;

    Method(String s) {
        method = s;
    }

    private String getMethod() {
        return method;
    }
}

Host类是Spring @ConfigurationProperties,其注解是在运行时注入来自application.properties文件的值。如果我将其写为enum的值,那么每次我使用Method.POST时,都会创建一个Host的新对象实例吗?

2 个答案:

答案 0 :(得分:2)

否,它将仅创建一次实例。可以使用如下打印声明来检查。 getAssets()和构造函数仅被调用一次:

    public class Host {

    public static void main(String[] args) {
        System.out.println("Hello World!");
        System.out.println(Method.POST);
        System.out.println(Method.POST);
        System.out.println(Method.POST);
    }

    Host()
    {
        System.out.println("--------------");
    }

    String getAssets()
    {
        System.out.println("ssssssssssss");
        return "eeee";
    }
}


enum Method {
    POST(new Host().getAssets()),
    GET("GET"),
    DELETE("DELETE"),
    PUT("PUT");

    private String method;

    Method(String s) {
        method = s;
    }

    private String getMethod() {
        return method;
    }
}

O / P:

    Hello World!
--------------
ssssssssssss
POST
POST
POST

答案 1 :(得分:1)

values中的所有Enumerator都是singletons,这意味着它们将被初始化一次,并在您每次访问它时重新使用。因此,您可以将枚举器值的“定义”视为“构造函数”。

这也意味着:如果为属性“ method”提供了一个setter并在运行时更改其值,则下一次访问将返回新值! singleton并非 表示其值为final

public enum Method {
    POST(new Host().getAssets()), // definition
    GET("GET"),// definition
    DELETE("DELETE"),// definition
    PUT("PUT");// definition

    private String method;

    // Constructor
    Method(String s) {
        method = s;
    }

    private String getMethod() {
        return method;
    }
}