0

甲级 1

public class A {

    private static final A instance = new A();

    public static A getInstance() {
        return new A();
    }

}

A级2

public class A {

    private static final A instance = new A();
    private A(){}
    public static A getInstance() {
        return instance;
    }

}

我刚开始学习单例,我看到了两个使用 A 1 类示例和 A 2 类示例的 Java 示例。A 类 1getInstance()是单例吗?我也想知道这两个A类方法有什么区别getInstance()?谢谢

4

5 回答 5

6

在 A1 中,A不是单例..每次getInstance()都返回一个新实例A

在 A2 中,不再A是单例,导致默认构造函数仍然(隐式)。可以轻松地从外部创建更多实例public

编辑:

由于您已经在 A2 中编辑了该类A,现在它变成了单例。

这里A是急切创建的,默认情况下是线程安全的。检查惰性与急切初始化

于 2013-07-08T07:57:47.863 回答
1

我也想知道这两个类A getInstance() 方法有什么区别

A类1:

如果您查看代码:

 public static A getInstance() {
    return new A();
}

A您在每次调用方法时都返回一个新实例,getInstance()因此它不是单例。此外,在这种情况下,您还没有创建默认构造函数private,并且您的类之外的任何代码都可以轻松地创建打破单例范式的类的实例。

A 2 类:

看这段代码:

public class A {

  private static final A instance = new A();
  private A(){}
  public static A getInstance() {
     return instance;
  }
}

您为每次调用返回相同的实例。getInstance()现在您的类的行为类似于 Singleton ,您实际上是在这里对 Singleton 实例进行急切的实例化,并且此 Singleton 实例应该是线程安全的。还要创建类final,以便没有人可以对其进行子类化并打破单例。

于 2013-07-08T08:13:10.523 回答
0

在第一种情况下

每次A创建 .

*在第二种情况下 *

按照单吨模式,应该是

public class A {
   private static A instance = null;
   private  A() {

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

该类A维护对单独单例实例的静态引用,并从静态 getInstance() 方法返回该引用。

于 2013-07-08T07:58:45.807 回答
0

A 类 1 getInstance() 是单例吗?

不,因为每次调用此方法时,都会创建一个新的实例A

我也想知道这两个 A 类 getInstance() 方法有什么区别?

第一个getInstance()将始终创建类 A 的新实例,第二个getInstance()将始终返回创建的类 A 的相同实例。

于 2013-07-08T08:00:32.470 回答
0
        There are two ways of creating a singleton class
        1, Dynamic Singleton
        2, Static Singleton

        Static Singleton :

        public class A {
          //Create a object of class A and make it final so that nobody can modify it
          private static final A instance = new A();

          //make the constructor private so that new objects can not be created
          private A(){}

          //provide a method to access the object
          public static A getInstance() {
             return instance;
          }
        }

        Dynamic Singleton :

a, Single Check
        public class A {
    //Create a object reference of class A
    private static A instance = null;

    //make the constructor private so that new objects can not be created
    private  A() {}


    public static A getInstance() {
        //check if instance is null or not
        if(instance == null) {
            if(instance == null) {
                //if null then create an instance of class A and assign it to the final reference
                instance = new A();
            }

        }
        return instance;
    }
}

b, double check
public class A {
    //Create a object reference of class A
    private static A instance = null;

    //make the constructor private so that new objects can not be created
    private  A() {}


    public static A getInstance() {
        //check if instance is null or not
        if(instance == null) {
            synchronized(A.class){
                //Double Check
                if(instance == null) {
                    //if null then create an instance of class A and assign it to the final reference
                    instance = new A();
                }
            }
        }
        return instance;
    }
}
于 2013-07-08T10:59:14.990 回答