Будет ли вызов перечисления со ссылкой на объект в качестве значения создавать объект каждый раз, когда он вызывается? - PullRequest
0 голосов
/ 22 ноября 2018

Это стало моей проблемой главным образом из-за этого:

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, будет ли он создавать новый экземпляр объекта Host каждый раз, когда я использую Method.POST?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Все values из Enumerator равны singletons, что означает, что они инициализируются один раз и повторно используются при каждом обращении к нему.Таким образом, вы можете увидеть «определение» значения перечислителя как «конструктор».

Это также означает: если вы предоставите установщик для свойства «method» и измените его значение во время выполнения, следующий доступ вернетновое значение!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;
    }
}
0 голосов
/ 22 ноября 2018

Нет, он создаст экземпляр только один раз.Это можно проверить с помощью инструкции для печати, как показано ниже.Здесь 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...