import java.util.*;
import java.lang.*;
import java.io.*;
class Logger {
private static final Logger logger = new Logger();
private static final String test = "value";
private Logger() {
System.out.println("Called Constructor!");
}
public static Logger getLogger() {
return logger;
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Logger logger;
Logger logger2 = Logger.getLogger();
}
}
除了了解上面的代码是否为单例代码外,我还有其他疑问。
Q1)创建变量logger
时为什么不调用私有构造函数,而当我调用函数getLogger()
时为什么要调用私有构造函数?
Q2)什么时候分配test
变量的值?在私有构造函数调用之前还是之后?
谢谢!
答案 0 :(得分:1)
是的,这是正确的单例,并且是线程安全的。
当我创建变量记录器时,为什么不调用私有构造函数,而当我调用函数getLogger()时,为什么要调用私有构造函数?
因为声明变量除了声明变量外没有其他作用。它不会调用任何方法,也不会创建任何对象。
何时分配测试变量的值?在私有构造函数调用之前还是之后?
同时,在初始化类时。
答案 1 :(得分:0)
这是正确的单例:
当我创建变量记录器时,为什么不调用私有构造函数,而当我调用函数getLogger()时,为什么要调用私有构造函数?
Soo ..当您声明一个变量时,您要做的是保留内存空间,而不是用记录器初始化它,而是在记录器类中静态声明Logger实例时,Java在运行时初始化了它,然后在您调用getLogger只是将指针提供给该Logger实例。
何时分配测试变量的值?在私有构造函数调用之前还是之后?
在构造函数被调用之后。