【问题标题】:Singleton Class return new Instance every time单例类每次都返回新的实例
【发布时间】:2016-10-21 00:12:44
【问题描述】:

我正在尝试创建一个单例类,但它每次都会返回一个新实例。这是我的代码。

我做错了吗?为什么每次都返回一个新实例?

应该和我想的一样。

public final class SingletonA {     
    private static SingletonA instance;

    private SingletonA(){
    }

    public static SingletonA getInstance() {    
        if(instance==null)
        {
            System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
            return new SingletonA();
        }
        System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
        return instance;
    }
}

public class SingletonB {
    public static void main(String[] args) {
        SingletonA one = SingletonA.getInstance();
        System.out.println("1."+one+" | "+one.hashCode());

        SingletonA two = SingletonA.getInstance();
        System.out.println("2."+two+" | "+two.hashCode());

        SingletonA three = SingletonA.getInstance();
        System.out.println("3."+three+" | "+three.hashCode());
    }
}

// HERE IS THE OUTPUT
RETURNING NEW INSTANCE OF SingletonA Class
1.oop.singleton.SingletonA@2a139a55 | 705927765
RETURNING NEW INSTANCE OF SingletonA Class
2.oop.singleton.SingletonA@15db9742 | 366712642
RETURNING NEW INSTANCE OF SingletonA Class
3.oop.singleton.SingletonA@6d06d69c | 1829164700

【问题讨论】:

  • 什么时候给instance分配一个非空值?
  • 必须将第一行中的实例分配给 = new SingletonA() 而不是每次都返回 new SingletonA()。

标签: java class singleton


【解决方案1】:

如下更改

if(instance==null) {
    System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
    instance = new SingletonA();
}

【讨论】:

    【解决方案2】:

    您必须分配instance 否则检查将始终为真,从而返回一个新实例:

    public static SingletonA getInstance() {    
        if(instance==null)
        {
            System.out.println("CREATING NEW INSTANCE OF SingletonA Class");
            instance = new SingletonA();
        }
        System.out.println("RETURNING INSTANCE OF SingletonA Class");
        return instance;
    }
    

    【讨论】:

      【解决方案3】:

      这里是不正确的,因为您正在返回 SingletonA 的新实例并且从不将其分配给对象实例。

       public static SingletonA getInstance() {    
              if(instance==null)
              {
                  System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
                  return new SingletonA();
              }
              System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
              return instance;
          }
      

      你的意思是肯定的

       public static SingletonA getInstance() {    
              if(instance==null)
              {
                  System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
                  instance = new SingletonA();
              }
              System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
              return instance;
          }
      

      【讨论】:

        【解决方案4】:

        您应该在返回 null 检查测试之前将实例初始化为 new SingletonA()。

        public final class SingletonA {     
            private static SingletonA instance;
        
            private SingletonA(){
            }
        
            public static SingletonA getInstance() {    
                if(instance==null)
                {
                    System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
                    // You are missing this assignment. 
                    instance = new SingletonA();
                    return instance; 
                }
                System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
                return instance;
            }
        }
        

        【讨论】:

          【解决方案5】:
          public static SingletonA getInstance() {    
              if(instance==null)
              {
                 instance = new SingletonA();
              }
              return instance;
          }
          

          【讨论】:

          • 您的答案与其他答案相比有何改进?请edit您的问题提供详细信息。
          猜你喜欢
          • 2018-10-16
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 2014-08-19
          • 1970-01-01
          • 1970-01-01
          • 2018-06-25
          相关资源
          最近更新 更多