gpt4 book ai didi

javascript - 如何创建一个不能在 TypeScript 外部实例化的类?

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:40 24 4
gpt4 key购买 nike

在Java中,我们有私有(private)构造函数

public class Singleton{
private static volatile Singleton INSTANCE = null;
private Singleton(){ }

public static Singleton getInstance(){
if(INSTANCE == null){
synchronized(Singleton.class){
if(INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}

这使得类不能在类外实例化。 TypeScript 中有类似的东西吗?

最佳答案

类似的东西应该可以工作:

class Singleton {

private static _instance:Singleton = new Singleton();

constructor() {
if (Singleton._instance){
throw new Error("Error: use getInstance()");
}
Singleton._instance = this;
}

public static getInstance():Singleton {
return Singleton._instance;
}

...
}

同样在java中没有必要使用惰性初始化,因为如果不使用单例则不会初始化。更好的方法:

public class Singleton {
private static Singleton INSTANCE = new Singleton();
private Singleton() {}

public Singleton getInstance(){
return INSTANCE;
}
}

回答 Zhipeng 的评论,静态初始化是线程安全的,正如在 12.4.2 的 JLS 中定义的那样:

The implementation of the Java Virtual Machine is responsible for taking care of synchronization and recursive initialization by using the following procedure...


注意:仅当可以在不使用 getInstance() 的情况下使用某些静态方法时,使用惰性实现才有用。在这种情况下,如果从未使用过,也会实例化 Singleton 类。


有关 Java 单例的完整描述,您可以查看我为 Dzone 撰写的一篇文章

关于javascript - 如何创建一个不能在 TypeScript 外部实例化的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37571292/

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