【问题标题】:Implement singleton with static access modifier in Java在 Java 中使用静态访问修饰符实现单例
【发布时间】:2015-06-24 07:04:35
【问题描述】:

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

  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");
        }
  }

我只是想知道我是否可以使用声明为静态的相同变量和方法来创建此类。和单例一样吗?

【问题讨论】:

  • 是的,你可以。这是一个有效的单例模式。

标签: java design-patterns singleton


【解决方案1】:

单例仅在满足以下所有三个条件时才应考虑:

  1. 无法合理分配单个实例的所有权
  2. 需要延迟初始化
  3. 未另外提供全局访问权限

是的,是一样的。

【讨论】:

    【解决方案2】:

    如果您真的需要实现单例模式,我建议您使用枚举:

    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

    【讨论】:

      【解决方案3】:

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

      所以不是

      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;
          }
      }
      

      (注意上面不是线程安全的,在多线程代码中你需要添加同步。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-29
        • 2011-05-03
        • 2013-05-25
        • 2015-03-18
        • 2015-12-10
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多