这引起了我的关注,主要是因为:
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
的新对象实例吗?
答案 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;
}
}