关于Java:单级类Singletons与静态类的区别?

Difference between singleton class and static class?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Difference between static class and singleton pattern?
What is the difference between a Singleton pattern and a static class in Java?

夏威夷群岛我不清楚单件课和静态课有什么区别?有人能举例说明这一点吗?


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

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

下面是从这个博客中引用的"Java静态类"很好地描述了它。博客中也有解释这一点的例子:

单例示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
    }
}

静态类示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * 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类中,除了传入的变量之外,我们不使用任何变量(这是我们最终确定的)。因为这个原因,我不认为我们需要一个单例实例,因为我们不需要任何变量,也不希望任何人实例化这个类。因此,如果您不希望任何人实例化该类(通常如果您有某种helper/utils类),那么我将使用我所称的静态类,一个带有私有构造函数的类,并且只包含没有任何变量的静态方法。

同样的答案也可以从我的答案中找到。


旧的que/ans on so:静态类和单例模式之间的区别?

静态类是只有静态方法的类,对于静态方法,更好的词是"函数"。静态类中包含的设计样式是纯过程的。

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


区别不是正确的提问方式。因为与static相比,singleton不是关键字。你应该问"什么时候选择哪一个?".与静态类相比,单例类的优点是什么,这些问题出现在设计阶段。

Singleton:用途:充当全局配置的类,例如:具有一个数据库连接的软件试用版,每个JVM的JDK运行时类实例。

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

静态的:用途:基本上做转换的类,实用函数。请查一下数学课。

什么时候去:1。帮助器类,由API开发中的所有类使用。

缺点:1。上课的人都很忙。

期待其他人的分数。


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

SuntLon模式不是专门绑定到Java语言的。根据所使用的语言,将类转换为单例可能有不同的方法。许多OO语言使用等效的静态变量来生成单例,但其他语言可能使用不同的技术。

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

1
2
3
4
5
6
7
public class Example {
    private static final Example SINGLETON = new Example();

    public static Example getInstance() { return SINGLETON; }

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

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


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

静态类始终是一个成员类,与内部类不同,它不能访问周围类的实例变量。

静态类示例

1
2
3
4
5
6
public class A {
  public static class B {        
  }    
  public        int notAccessibleForB;
  public static int    accessibleForB;
}

单件图案(简单的旧样式)

1
2
3
4
public final class Singleton {
  public final static Singleton INSTANCE = new Singleton();
  private Singleton(){}
}

单件图案(简单现代风格)

1
2
3
public enum Singleton {
   INSTANCE;
}