单例类和静态类之间的区别?

时间:2010-09-15 05:47:00

标签: java static singleton

  

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

HI 我不明白得到单例类和静态类有什么区别? 任何人都可以用例子来详细解释这个吗?

5 个答案:

答案 0 :(得分:18)

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

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

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

Singleton 示例:

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模式非常有用。对于我的助手类,我们并不想真正实例化该类的任何副本。你不应该使用Singleton类的原因是因为对于这个助手类我们不使用任何变量。如果单例类包含一组我们只需要一组变量并且方法使用这些变量但是在我们的帮助器类中我们不使用除传入的变量之外的任何变量(我们做的是最终的) 。出于这个原因,我不相信我们想要一个单例实例,因为我们不想要任何变量,我们不希望任何人实例化这个类。因此,如果您不希望任何人实例化该类,通常如果您有某种类型的helper / utils类,那么我使用我称之为静态类的类,一个带有私有构造函数的类,并且只包含静态方法而没有任何类任何变量。

我的回答here

也引用了相同的答案

答案 1 :(得分:16)

SO上的旧que / ans:Difference between static class and singleton pattern?

静态类是仅具有静态方法的类,对于该类,更好的单词将是“函数”。静态类中体现的设计风格纯粹是程序性的。

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

答案 2 :(得分:6)

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

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

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

静: 用法: 基本上做转换,实用功能的类。请查看数学课程。

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

缺点: 1.课程急切加载。

期待其他人的积分。

答案 3 :(得分:4)

模式与模式的实现方式之间存在差异。

Singleton模式与Java语言无关。根据您使用的语言,可能有不同的方法将类制作成单例。许多OO语言使用等效的静态变量来制作单例,但其他语言可能使用不同的技术。

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

public class Example {
    private static final Example SINGLETON = new Example();

    public static Example getInstance() { return SINGLETON; }

    private Example() { /* Constructor */ }
}

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

答案 4 :(得分:1)

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