在Java中使用静态访问修饰符实现单例

时间:2015-06-24 07:04:35

标签: java design-patterns singleton

具有单例设计模式的示例类。

  class Singleton {
        private static Singleton instance;
        private int x;

        private Singleton() {
             x = 5;
        }

        public static synchronized Singleton getInstance() {
            if(instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
            public void doSomething() {
                System.out.println("Hello");
        }
  }

我只是想知道我可以使用声明为static的相同变量和方法创建此类。和单身人士一样吗?

3 个答案:

答案 0 :(得分:0)

仅当满足以下所有三个条件时,才应考虑

Singleton

  1. 无法合理分配单个实例的所有权
  2. 延迟初始化是可取的
  3. 未另行规定全球访问权限

    是的,它是一样的。

答案 1 :(得分:0)

如果你真的需要实现singelton模式,我建议使用枚举:

public enum MySingelton{
 INSTANCE;
   private final String[] variable = new String[]{"test", "test2};
 public void randomFunction(){     
 }
}

用以下方式调用:

MySingelton.INSTANCE.randomFunction();

通过枚举实现,它可以保证只创建一个实例,并且它始终可用。此外,还可以对singelton进行序列化和反序列化,而无需创建多个副本。

可在此处找到更多信息:

What is an efficient way to implement a singleton pattern in Java?

http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=3

答案 2 :(得分:0)

由于单例模式的目的是确保存在类的单个实例,是的,您可以使用静态成员来实现相同的效果。

所以而不是

public class Singleton {
    private static Singleton theInstance = new Singleton();
    private int aVar = 10;
    public void aMethod() { 
        System.out.println(aVar);
    }
    public static Singleton getInstance() {
        return theInstance;
    }
}

你可以做到

public class FakeSingleton {
    private static int aVar = 10;
    public static void aMethod() {
        System.out.println(aVar);
    }
}

并具有完全相同的功能(而不是Singleton.getInstance().aMethod(),您可以编写FakeSingleton.aMethod())。

如果您想要延迟初始化,使用单例模式可能是有利的,因此单例只在首次需要时才初始化,如下所示:

public class Singleton {
    private static Singleton theInstance = null;
    private int aVar = 10;
    public void aMethod() { 
        System.out.println(aVar);
    }
    public static Singleton getInstance() {
        if (theInstance == null) {
            theInstance = new Singleton();
        }
        return theInstance;
    }
}

(请注意,上述内容不是线程安全的,在多线程代码中,您需要添加同步。)