gpt4 book ai didi

单例设计模式中的Java静态对象范围不会抛出空指针异常

转载 作者:行者123 更新时间:2023-11-30 10:13:17 24 4
gpt4 key购买 nike

我在练习单例模式时创建了如下类:

class Singleton
{
// static variable single_instance of type Singleton
private static final Singleton single_instance = new Singleton();

// private constructor restricted to this class itself
private Singleton()
{
System.out.println("Yahoo");
}

// static method to create instance of Singleton class
public static Singleton getInstance()
{
return single_instance;
}
public static void getDemo()
{
System.out.println("YOHOO");
}
}

我知道它不完全正确。但是在主类中,在主函数中我这样调用:

package common;

public class TestMain {

public static void main(String[] args) {
Singleton tmp = Singleton.getInstance();
tmp = null;
System.out.println(tmp);
tmp.getDemo();

}

}

打印出来的是:

Yahoo
null
YOHOO

但是为什么第二次调用getDemo()时不会出现空指针异常呢?我不确定我是否遗漏了任何范围详细信息,但非常感谢您的帮助。

最佳答案

通过类前缀访问静态方法或使用类类型声明的变量将产生相同的结果。
编译器不会评估 tmp 对象来调用该方法,而是直接调用静态方法。

JLS 所述:

15.12.4.1. Compute Target Reference (If Necessary)

There are six cases to consider, depending on the form of the method invocation:

  • If the form is MethodName - that is, just an Identifier - then:

    • If the invocation mode is static, then there is no target reference.

请注意,编译器还应发出以下警告:

The static method getDemo() from the type Singleton should be accessed in a static way

因此您应该遵循此建议并将其替换为:

Singleton.getDemo();

编译类的 main() 方法的反汇编版本显示:

  public static void main(java.lang.String[]);
Code:
0: invokestatic #16 // Method common/Singleton.getInstance:()Lcommon/Singleton;
3: astore_1
4: aconst_null
5: astore_1
6: getstatic #22 // Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_1
10: invokevirtual #28 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
13: invokestatic #34 // Method Lcommon/Singleton.getDemo:()V
16: return
}

关于单例设计模式中的Java静态对象范围不会抛出空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51376788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com