【问题标题】:Difference between singleton class and static class? [duplicate]单例类和静态类的区别? [复制]
【发布时间】:2011-04-12 12:19:20
【问题描述】:

可能的重复:
Difference between static class and singleton pattern?
What is the difference between a Singleton pattern and a static class in Java?

你好 我不清楚单例类和静态类有什么区别? 谁能举例说明一下?

【问题讨论】:

标签: java static singleton


【解决方案1】:

单例类:单例类是每个类加载器只能存在单个实例的类。

静态/帮助类(只有静态字段/方法的类):不存在此类的实例。只有字段和方法可以作为常量或辅助方法直接访问。

以下引用自此blog "Static classes in Java" 很好地描述了它。该博客也有解释相同的示例:

单例示例:

public class ClassicSingleton {
    private static ClassicSingleton instance = null;

    private ClassicSingleton() {
        // Exists only to defeat instantiation.
    }

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

静态类示例:

/**
 * A helper class with useful static utility functions.
 */
public final class ActionHelper {

    /**
     * private constructor to stop people instantiating it.
     */
    private ActionHelper() {
        // this is never run
    }

    /**
     * prints hello world and then the users name
     * 
     * @param users
     *            name
     */
    public static void printHelloWorld(final String name) {
        System.out.println("Hello World its " + name);
    }

}

那么这两个示例之间有什么区别,为什么我认为第二种解决方案更适合您不想或不需要实例化的类。首先,如果您想创建一个类的一个实例,单例模式非常有用。对于我的助手类,我们真的不想实例化该类的任何副本。不应该使用 Singleton 类的原因是,对于这个帮助类,我们不使用任何变量。如果单例类包含一组我们只想要一组的变量并且方法使用这些变量但在我们的帮助类中我们不使用除了传入的变量(我们将其设为最终变量)之外的任何变量,那么单例类将很有用.出于这个原因,我不相信我们想要一个单例实例,因为我们不想要任何变量,也不想要任何人实例化这个类。因此,如果您不希望任何人实例化该类,通常是如果您有某种帮助程序/实用程序类,那么我将使用我称之为静态类的类,它是一个具有私有构造函数的类,并且仅包含静态方法而没有任何任何变量。

我的回答here也引用了同样的答案

【讨论】:

  • Java 反射仍然可以用来打破“静态类”没有实例的不变量。 enum solution 仍将保留不变量。
  • 为什么要打败实例化?如果您需要构造函数参数来遵循逻辑并且仍然保持其余部分不变,该怎么办。
  • 在单例示例中,getInstance 不是线程安全的,需要同步。
【解决方案2】:

SO 上的老问题:Difference between static class and singleton pattern?

静态类是只有静态方法的类,更好的词是“函数”。静态类所体现的设计风格是纯程序化的。

另一方面,Singleton 是一种特定于 OO 设计的模式。它是一个对象的实例(具有其中固有的所有可能性,例如多态性),具有一个创建过程,可确保该特定角色在其整个生命周期内只有一个实例。

【讨论】:

    【解决方案3】:

    区别不是问的正确方法。因为单例与静态相比不是关键字。你应该问“什么时候选择哪一个?”。单例类比静态类有什么优势,这些问题在设计阶段就出现了。

    单例: 用法: 用作全局配置的类,例如:具有一个数据库连接的试用版软件,每个 jvm 的 JDK 运行时类实例。

    什么时候去: 1.在开发代码时,您会想到前向兼容性,例如明天需要将此单例类转换为普通类或允许子类化时。 2. 当这个单例类很重时,你可以提供延迟加载功能。

    静态: 用法: 基本上进行转换的类,实用功能。请检查数学课。

    什么时候去: 1. 辅助类,供你api开发中的所有类使用。

    缺点: 1. 类被热切加载。

    期待其他人的分数。

    【讨论】:

      【解决方案4】:

      这是模式和模式实现方式之间的区别。

      单例模式与 Java 语言没有特别的联系。根据您使用的语言,可能有不同的方法可以将类变成单例。许多 OO 语言使用等效的静态变量来创建单例,但其他语言可能使用不同的技术。

      此外,实现单例的某些方法比其他方法更好。实现 Singleton 的一种好方法是通过工厂方法正确封装对该 Singleton 的访问:

      public class Example {
          private static final Example SINGLETON = new Example();
      
          public static Example getInstance() { return SINGLETON; }
      
          private Example() { /* Constructor */ }
      }
      

      使用这种技术,您可以做各种复杂的事情:延迟加载单例,用某些子类替换它,通过配置管理单例初始化等等。

      【讨论】:

      • 如果你的getInstance()方法不是static,如果潜在用户需要一个实例来接收一个实例,他们应该如何获得这个类的实例?
      【解决方案5】:

      Singleton 不是类的类型,而是设计模式。使用 Singleton,您(尝试)保证在单个 Java 虚拟机中只构造某个类的一个实例。顺便说一下,单例模式的现代实现使用枚举。较旧的实现使用私有构造函数并将对单个实例的引用存储在静态字段中。

      静态类始终是成员类,与内部类相比,它无法访问周围类的实例变量。


      静态类示例

      public class A {
        public static class B {        
        }     
        public        int notAccessibleForB;
        public static int    accessibleForB;
      }
      

      单例模式(简单旧式)

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

      单例模式(简约现代风格)

      public enum Singleton {
         INSTANCE;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-06
        • 2011-10-03
        • 1970-01-01
        • 2014-06-27
        • 2011-04-01
        • 2010-10-05
        • 2016-08-20
        • 2012-11-15
        • 1970-01-01
        相关资源
        最近更新 更多