为什么不在java中提供单例实例?

时间:2012-05-03 17:30:36

标签: java singleton

您可以通过实现Singleton模式来创建类单例。如今单身人士课是基本要求。

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

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

1)同步的getInstance()

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

3)选项2,将singleInstance作为volatile成员

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

5 个答案:

答案 0 :(得分:5)

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

  1. 私人构造函数
  2. 静态最终字段
  3. (可选)如果您希望该类可序列化,则readResolvewriteObject的简单实现
  4. 我遇到的大多数单身人士并不关心序列化,因此不需要第三步。这给你留下了两个非常非常简单的步骤。

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

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

答案 1 :(得分:3)

实施基本设计模式不是核心语言的责任,除非有令人信服的理由。设计模式来来去去 - 例如,单身模式被广泛认为是一种永远不应该使用的极其糟糕的模式。即使你决定使用它,你想要一个热切的单身人士吗?懒单身?如果由于某种原因实例化失败会发生什么?有很多看似微不足道的问题需要解决,但是在语言中添加这个功能并不是一个微不足道的改变。

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

答案 2 :(得分:2)

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

public enum Singleton {
    INSTANCE;
}

答案 3 :(得分:0)

Singletons有两个基本类别,即懒惰初始化和初始化初始化。

除了关于Singletons风味的整个论点之外,许多Java开发人员认为Singletons是坏的或反模式。这可能是目前维护Java规范的人之间的分歧。

最后,大多数模式都可以这样说。恕我直言,并没有非常需要一种语言来采用或支持任何特定的模式。

答案 4 :(得分:0)

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

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