gpt4 book ai didi

java - 需要有关java中单例类的信息

转载 作者:行者123 更新时间:2023-12-02 07:58:40 25 4
gpt4 key购买 nike

在提出问题之前,为了清楚起见,我想提供代码。下面是我的单例类代码。

public class CoreData {

private boolean VarA;

private static CoreData instance = null;

protected CoreData() {
// Exists only to defeat instantiation.
}

public static CoreData getInstance() {
if(instance == null) {
instance = new CoreData();
}
return instance;
}

public boolean getVarA(){
return VarA;
}

public void setFirstTime(boolean B){
VarA = B;
}
}

现在我有几个问题要问

  1. 如果将成员变量 VarA 设置为 static 会有什么不同?
  2. 我可以在 getInstance() 方法中初始化成员变量吗?
  3. 在 Singleton 类中初始化成员变量的最佳实践是什么?
  4. 将此类设为最终类有何意义?
  5. 将成员变量设为 Final 的含义是什么。

我对 java 和 OOPS 很陌生。我现在正在学习。如果有人回答我的问题以提高我的知识,我将不胜感激。

最佳答案

因为您只有一个实例(或者您认为如此 - 见下文),因此将其设为静态应该不会产生任何影响。

您的代码不是线程安全的!您可以创建两个实例。原因是,在检查实例是否为空后,另一个线程也可以检查并发现它为空 - 两个线程都会创建实例并返回它们。一个人会“逃脱”。

传统的方法是“双重检查锁定”,其中检查是在同步块(synchronized block)内进行的,但正如 Bill Pugh 在他的 famous article 中指出的那样。 ,这是一个损坏的模式。 Java 1.5 引入了 volatile 关键字来解决这个问题,但它仍然是丑陋的代码。

延迟初始化实例的现代最佳实践方法是使用以下模式之一:

public class CoreData {

private static class InstanceHolder {
static CoreData INSTANCE = new CoreData();
}

public static CoreData getInstance() {
return InstanceHolder.INSTANCE;
}
}

public static enum CoreData {

INSTANCE;

// rest of class
}

两者都由语言保证创建单例,但枚举版本是“铁定的” - 通过反序列化黑客可以影响静态持有者类模式中实例的状态。除了这个微小的漏洞之外,两者都有效。我更喜欢代码中的第一个选项,因为它避免了类膨胀。

关于java - 需要有关java中单例类的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9239832/

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