当前位置: 首页 > 面试题库 >

Singleton程序中静态语句的使用和流向

陶文林
2023-03-14
问题内容

我知道Singleton模式有很多问题。但是在这里,我想了解有关输出的信息,该输出也可能涵盖Java中“静态”的工作方式。

public class Singleton {
    private static Singleton currentSingleton = new Singleton();

    public static Singleton getSingleton() { 
        return currentSingleton;
    }

    private Singleton() {
        System.out.println("Singleton private constructor...");
    }

    public static void main(String[] args) {
        System.out.println("Main method...");
    }

}

这是运行代码的输出…

单例私有构造函数…
主要方法…

当我调试此代码时,控制权首先移至行 System.out.println("Singleton private constructor...")并打印。(此时,私有静态变量currentSingleton仍为null),
然后转到第几行
private static Singleton currentSingleton = new Singleton();
,然后初始化私有变量。然后最后进入main()方法并打印。

我的问题是:

  1. 为什么它首先打印私有构造函数中的“ Singleton私有构造函数…”。我认为控件应该首先进入main()方法,因为它是入口点。我也没有在任何地方创建任何实例(变量初始化除外)。
  2. 后来它转到静态变量实例化行(此时的currentSingleton = null)
    private static Singleton currentSingleton = new Singleton();
    尽管currentSingleton在这里获得了一个值,但为什么不再次调用构造函数?

我主要想知道该程序的控制流程。


问题答案:

在正确初始化类之前(即已评估静态字段和静态块),您无法在类中调用main方法。初始化后,将通过调用私有构造函数来创建您的单例实例。稍后调用main方法。

有问题的类具有一个静态字段,您可以在该字段中添加值。由于该字段是静态的,因此必须先初始化该字段,然后才能在任何上下文中使用该类,也就是说,它必须接收一个值。在这种情况下,其值恰巧是同一类的实例。这就是在类初始化期间触发您的私有构造函数的原因。

如果您想深入研究过程并更好地理解它,请参考Java
Laguage规范
。更具体地说,在第12.4节“类和接口的初始化”中,您将找到更多详细信息。



 类似资料:
  • 使用卡桑德拉准备语句时,将字段与静态值绑定是否有任何好处? 例如,即使我总是使用静态值“Active”,status是否也应该有一个bind变量?如果是,为什么? 更新用户设置status='Active',其中user_id=:userid

  • 问题内容: Swift的最佳做法是什么? 选项1: 然后 选项2: 然后 问题答案: tl; dr 当您存储可变状态时的选项1(类或结构),因为您需要其他实例。 当您要存储静态变量时,可以使用选项2(作用域全局变量),因为它速度更快且使用的内存更少。 具有变量的Singleton类(或结构) 全球状态通常被认为是“坏事”。很难考虑,会引起问题,但有时是不可避免的。 如果您想拥有多个实例,请创建一个

  • 问题内容: 单例与仅填充静态字段的类有何不同? 问题答案: 几乎每次我编写静态类时,我最终都希望自己将其实现为非静态类。考虑: 可以扩展非静态类。多态可以节省很多重复。 非静态类可以实现接口,当您要将实现与API分开时,该接口会派上用场。 由于这两点,非静态类使编写依赖它们的项目的更可靠的单元测试成为可能。 但是,单例模式距离静态类仅半步之遥。你_那种_得到这些好处,但如果你是直接与其它类中通过`

  • 一、条件表达式if Scala 中的 if/else 语法结构与 Java 中的一样,唯一不同的是,Scala 中的 if 表达式是有返回值的。 object ScalaApp extends App { val x = "scala" val result = if (x.length == 5) "true" else "false" print(result) } 在 Ja

  • 我有下面的代码块,希望使用Kotlin减少它。我该怎么做?

  • Kotlin 具有非常好的迭代函数,例如 或 ,但我无法(本地和非本地): 目标是尽可能接近函数语法来模仿通常的循环。这在一些旧版本的静态编程语言中肯定是可能的,但我很难重现语法。 问题可能是标签(M12)的错误,但我认为第一个示例无论如何都应该可以工作。 在我看来,我在某处读到过一个关于特殊技巧/注释的内容,但我找不到任何关于这个主题的参考资料。可能如下所示: