需要关于java中singleton类的信息吗

需要关于java中singleton类的信息吗,java,static,singleton,Java,Static,Singleton,在我提出这个问题之前,我想提供一个清晰的代码。下面是我的singleton类代码 public class CoreData { private boolean VarA; private static CoreData instance = null; protected CoreData() { // Exists only to defeat instantiation. } public static CoreData

在我提出这个问题之前,我想提供一个清晰的代码。下面是我的singleton类代码

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;
    }
}
现在我有几个问题要问

  • 如果将成员变量VarA设置为静态,会有什么区别
  • 我可以在getInstance()方法中初始化成员变量吗
  • 在Singleton类中初始化成员变量的最佳实践是什么
  • 把这门课作为期末考试有什么意义
  • 使成员变量为final的含义是什么

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

    因为你只有一个实例(或者你认为-见下文),让它保持静态不会有任何区别

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

    传统的方法是“双重检查锁定”,即在同步块内进行检查,但正如Bill Pugh在他的文章中指出的那样,这是一种中断模式。Java1.5引入了
    volatile
    关键字来解决这个问题,但它仍然是丑陋的代码

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

    public class CoreData {
    
        private static class InstanceHolder {
            static CoreData INSTANCE = new CoreData();
        }
    
        public static CoreData getInstance() {
            return InstanceHolder.INSTANCE;
        }
    }
    

    这两种语言都可以保证创建单例,但是enum版本是“铁包子”——可以通过反序列化攻击来影响静态holder类模式中实例的状态。除了那个微小的弱点,这两种方法都有效。我更喜欢代码中的第一个选项,因为它避免了类膨胀

    如果将成员变量
    VarA
    设置为
    static
    ,会有什么区别

    以后要使它成为非独生子女将更加困难

    我可以在方法
    getInstance()
    中初始化成员变量吗

    嗯。为什么不呢?但实际上,构造函数已经为此完成了

    在Singleton类中初始化成员变量的最佳实践是什么

    根据最佳实践,您应该使用一些IoC,并且不要在逻辑代码中添加任何关于作用域的代码

    把这门课作为期末考试有什么意义

    您应该使用
    private
    构造函数而不是
    protected
    一个构造函数,或者将其设置为
    final
    ,以防止通过扩展创建多个实例。比如
    newcoredata(){}

    使成员变量为final的含义是什么


    我认为默认情况下,所有变量都应该是最终的。此外,它还可以帮助您解决多线程问题。

    感谢您提出的使其线程安全的建议。这对我来说是一件新事情。你能告诉我如何在getInstance()方法中初始化变量吗。如果我直接将值赋给member,它会告诉我“不能对非静态字段进行静态引用”。@Bohemian,感谢您提供了这篇关于双重检查锁定的好信息和文章。
    受保护的
    构造函数不会破坏实例化(从外部),而
    私有
    就可以了。谢谢您的回答。你能告诉我如何在getInstance()方法中初始化变量吗。如果我直接将值分配给member,它会告诉我一个“不能对非静态字段进行静态引用”@Surjya Narayana Padhi,就像
    If(instance==null){instance=new CoreData();instance.VarA=false;}
    如果默认情况下所有变量都是final,那么它们可能会被称为不同的名称。哦,等等,我知道。。。让我们称之为常数!
    public static enum CoreData {
    
        INSTANCE;
    
        // rest of class
    }