gpt4 book ai didi

java - 有没有办法在java中的单例代码下面打破这个

转载 作者:行者123 更新时间:2023-11-29 09:44:38 25 4
gpt4 key购买 nike

这是一个单例类。

我想知道如何打破这段代码中的单例逻辑

class Employee{ // class starts
private Employee(){} // private constructor

private static Employee emp;
/*static block*/

static {
if (emp==null)
{
emp=new Employee();
}
}
/* static method*/
public static Employee getEmployee()
{
return emp;
}
}

最佳答案

您只需要一个 Employee 实例吗?

class Employee{ // class starts
private Employee(){}
public static final Employee INSTANCE = new Employee();
}

不需要 setter/getter ,代码就目前而言是安全的,只需使用:

Employee.INSTANCE

请注意:Employee 听起来像一个值对象,具有单例值对象似乎很不寻常。

更新:看来我终于明白问题是什么了。这个单例是安全的,除非使用一些非常重的火炮:

  • 使用反射使构造函数 public(参见 Marko Topolnik 的精彩回答)。我想这可以通过一些安全管理器设置来避免

  • Java 序列化 - 不太可能,单例必须实现 Serializable

  • 不同的类加载器 ( illustrated )

除了这些常见问题外,您的代码还不错,但不够漂亮。 static 初始化保证在加载类时以原子方式运行一次。

关于java - 有没有办法在java中的单例代码下面打破这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13066520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com