答案 1
单例类:单例类是每个类装入器只能存在单个实例的类。
静态/帮助器类(仅具有静态字段/方法的类):不存在此类的实例。只有字段和方法可以作为常量或帮助器方法直接访问。
下面引用了这个博客“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 类的原因是,对于此帮助程序类,我们不使用任何变量。如果单例类包含一组我们只需要一组变量并且方法使用这些变量,那么它将非常有用,但是在我们的帮助器类中,除了传入的变量(我们将其设置为 final)之外,我们不使用任何变量。出于这个原因,我不相信我们想要一个单例实例,因为我们不需要任何变量,我们不希望任何人实例化这个类。因此,如果您不希望任何人实例化该类,这通常是如果您有某种帮助器/utils类,那么我使用我所说的静态类,这是一个具有私有构造函数的类,仅由静态方法组成,没有任何变量。
同样的答案也从我的答案中引用在这里
答案 2
关于SO的旧问题:静态类和单例模式之间的区别?
静态类是一个只有静态方法的类,对于它来说,更好的词是“函数”。静态类中体现的设计风格纯粹是过程性的。
另一方面,Singleton是特定于OO设计的模式。它是一个对象的实例(具有其中固有的所有可能性,例如多态性),其创建过程可确保该特定角色的整个生命周期中只有一个实例。
推荐
-
当我们第一次使用类时,静态代码是否总是执行的? 我们的应用程序使用的初始化代码取决于静态代码的执行顺序,我想知道这个顺序是否在所有JVM中都是一致的。 以下是我的意思示例: 总而言之,在所有 JVM 中,当我们第一次使用类时,静
-
-
在 Java 中,对 super() 参数列表中的静态方法的调用是有效的。为什么? 让我们看一下 Java 中的以下代码片段。 但是,导致编译时错误是非法的,该错误指示“对 super 的调用必须是构造函数中的第一个语句”。为什么?以及为什么它是等效的 super(method()); 是
-
跨多个不同子类的静态变量 - 已更正 我想知道如果我定义一个基本活动对象,并将我的所有活动作为该对象的子类,会发生什么。然后,我在基类中声明一个静态变量,所有子类都将使用相同的静态变量,还是每个子类都有一个。
-
在泛型类中声明静态泛型变量 我已经读到你不能在泛型类中声明静态变量/方法,我真的不知道如何解决我的问题或解决它,所以我请求你的指导。 我想要的是一个通用的“索引”,我所有的核心类都将扩展它。我正在创建