0

您可以通过实现单例模式来制作单例类。现在单例类是基本要求。

为什么 JVM 在运行时不自己处理 Singleton 对象的创建?

通过拥有像“Singleton”这样的标记接口并在运行时由JVM创建一次对象实例。无论如何,如果 Class 没有扩展任何其他类,Java 编译器会添加“扩展对象”。类似的方法可以应用于 Singleton 情况。这将节省大量时间和开发工作以及围绕单例模式的各种实现的讨论。

1) 同步的 getInstance()

2) getInstance() 中的同步块,而不是使整个方法同步

3) 以 singleInstance 作为 volatile 成员的选项 2

如果您需要在多个类中实现单例模式,这也将节省大量时间和重复工作(不考虑 SingletonPatternFactory 类,它将返回已传递的任何类的单例实例)

4

5 回答 5

5

让我们看一下创建单例所需的所有步骤:

  1. 私有构造函数
  2. 静态最终字段
  3. (可选)如果你希望类是可序列化的,简单的实现readResolvewriteObject

我遇到的大多数单例都不关心序列化,因此不需要第三步。这给你留下了两个非常非常简单的步骤。

public class Whatever extends WhateverElse {
    public static final Whatever INSTANCE = new Whatever();

    private Whatever() {}
}

它甚至是延迟加载的,因为在您访问该类之前不会运行构造函数,这只会获取它的单例实例。就时间和开发工作而言,我不知道您对“很多”的定义是什么,但我不认为这是繁重的。

于 2012-05-03T17:41:50.870 回答
3

实现基本设计模式不是核心语言的责任,除非有令人信服的理由。设计模式来来去去——例如,单例模式被广泛认为是一种非常糟糕的模式,永远不应该使用。即使您决定无论如何都要使用它,您是否想要一个渴望的单身人士?懒惰的单身人士?如果实例化由于某种原因失败会发生什么?有很多看似微不足道的问题需要解决,但是将这个特性添加到语言中并不是一个微不足道的改变。

通过自己实现它,您可以获得所需的功能和行为。

于 2012-05-03T17:45:52.257 回答
2

您可以使用枚举而不是单例模式 - 这不是很复杂:

public enum Singleton {
    INSTANCE;
}
于 2012-05-03T17:33:09.660 回答
0

有两种基本类型的单例,一种是延迟初始化,另一种是急切初始化。

除了关于 Singleton 风格的全部争论之外,许多 Java 开发人员认为 Singleton 是不好的或反模式。这可能是目前维护 Java 规范的人之间存在分歧的一个领域。

最后,几乎所有模式都可以这样说。恕我直言,不需要一种语言来采用或认可任何特定的模式集。

于 2012-05-03T17:45:20.253 回答
0

您不会想要一个 Singleton 接口,因为该接口没有自己的行为。你会想要一个抽象类......有点。实际上,您会想要比抽象的父级更强大的东西。您需要有一个私有构造函数(或调用私有构造函数并返回单个实例的私有实例化方法),该构造函数必须在父级中定义的 getInstance() 方法中调用(违反范围)。

您所建议的是可以在传统班级系统之外起作用的东西。也许它可以作为一种新的对象类型来完成(类似于枚举不是类),但绝对不能作为标准接口或类。

于 2012-05-03T17:50:45.953 回答