【问题标题】:Java Singleton PatternJava 单例模式
【发布时间】:2010-05-14 06:42:03
【问题描述】:

编辑:已回答 - 错误是方法不是静态的

我用的是Singleton Design Pattern

 public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
 }

我的问题是如何在 another 类中创建 Singleton 类的对象?

我试过了:

Singleton singleton = new Singleton(); 
// error - constructor is private
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context

什么是正确的代码?

谢谢, 斯宾塞

【问题讨论】:

  • 仅供参考,有些人在getInstance() 中避免使用get,因为JavaBean naming convention 用于属性。另一种选择是instance()

标签: java design-patterns singleton initialization


【解决方案1】:
Singleton singleton = Singleton.getInstance();

是正确的方法。确保您的 getInstance() 方法确实是 static

由于您的 Singleton 实现远非安全 - 您的对象可以通过反射实例化,您可能希望基于 enum 创建一个单例

【讨论】:

  • 这正是我所做的,忘记将方法设为静态。谢谢
  • 我认为不需要保护代码不被反射滥用。那些使用反射的人(应该)知道危险。
  • @Bart van Heukelom 理论上我完全同意你的看法。但可惜在实践中这通常不是真的:)
【解决方案2】:

Singleton singleton = Singleton.getInstance(); 应该可以工作——考虑到你的代码,这个错误没有意义;你确定你的报告正确吗? (如果您忘记将 getInstance 方法设为静态,这将是有意义的,您已经在上面的代码中完成了。)

您为我们提供的课程代码是正确的。

最后,一个概念说明:首先,您不是“创建单例类的对象”——这就是单例的全部意义所在。 :) 您只是获得了对现有对象的引用。

【讨论】:

    【解决方案3】:

    这个:

     Singleton singleton = Singleton.getInstance();
    

    应该可以。这就是在 Java 中调用静态方法的方式。而getInstance() 方法被声明为static。您确定您使用的是相同的 Singleton 类吗?或者你可能已经在其他包中导入了一个名为相同的类。

    【讨论】:

      【解决方案4】:
      1. 由于构造函数是私有的,使用构造函数创建对象没有意义。
      2. 你应该使用public static Singleton getInstance(),但实现不是很正确。

        if (instance == null) {
        instance = new Singleton();
        }
        return instance;

      这就是你应该这样做的方式。这确保它在实例不存在时创建实例,或者简单地返回现有实例。你的代码也会做同样的事情,但这增加了可读性。

      【讨论】:

        【解决方案5】:

        因为我们不想允许访问多个副本。所以我们需要手动实例化一个对象,但我们需要保留对单例的引用,以便后续调用访问器方法可以返回单例(而不是创建一个新的)。 这就是为什么

        Singleton singleton = Singleton.getInstance();
        

        访问任何单例对象的正确方法。

        【讨论】:

          【解决方案6】:

          使用没有错

          Singleton singleton = Singleton.getInstance();
          // error - non-static method cannot be referenced from a static context
          

          这是从类中获取单例对象的方法。我必须有别的东西。请发布更多详细信息

          【讨论】:

            【解决方案7】:

            仍然可以创建多个类的实例,如下所示:

            Singleton.getInstance().clone()
            

            【讨论】:

              【解决方案8】:

              由于 getInstance() 方法是“静态的”并且实例字段也是,你可以使用 Singleton.getInstance();无需创建新的类示例。这就是单音的重点

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-08-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多