Java 扩展单例是错误的吗?
Singleton的概念(至少在java中)说它必须用私有构造函数实现,对吗? 例: 然而,如果我们忽略这个事实,用一个受保护的构造函数来做,他会不再是一个单例吗?我在网上看到了一些关于这个场景的例子Java 扩展单例是错误的吗?,java,singleton,Java,Singleton,Singleton的概念(至少在java中)说它必须用私有构造函数实现,对吗? 例: 然而,如果我们忽略这个事实,用一个受保护的构造函数来做,他会不再是一个单例吗?我在网上看到了一些关于这个场景的例子 public class Singleton { private static Singleton singleton; protected Singleton() { } public synchronized static Singleton getIns
public class Singleton {
private static Singleton singleton;
protected Singleton() {
}
public synchronized static Singleton getInstance() {
if (singleton == null) {
int tipoDoSingletonParaInstanciar = leUmArquivoTexto();
if (tipoDoSingletonParaInstanciar == 1) {
singleton = new SingletonSubclasse1();
} else if(tipoDoSingletonParaInstanciar == 2) {
singleton = new SingletonSubclasse2();
} else {
singleton = new Singleton();
}
}
return singleton;
}
public void metodoQuePodeSerSobrescrito() {
System.err.println("Singleton.metodoQuePodeSerSobrescrito()");
}
}
如果受保护的构造函数本身不是问题。。。继承一个单例并不意味着它的子类可以创建多个父实例?这不是打破了这个概念吗
有没有可能继承一个单例而不破坏它的概念(阻塞)?通过创建多个对象,这意味着它不再是单例。 如果你这样做,你就打破了单身的概念
当类是抽象类时,应该使用受保护的构造函数。在这种情况下,您不希望从类中实例化对象,而只希望使用它从中继承。通过创建多个对象,这意味着它不再是单例对象。 如果你这样做,你就打破了单身的概念
当类是抽象类时,应该使用受保护的构造函数。在这种情况下,您不希望从类实例化对象,而只希望将其用于从继承。
Singleton
应该是final
。如果创建Singleton
的子类,则它是-aSingleton
。所以你有两个。这不是一个单例
。单例和只创建一个实例的对象之间有一个重要的区别。您正在描述后者。Singleton
应该是final
。如果创建Singleton
的子类,则它是-aSingleton
。所以你有两个。这不是一个单例
。单例和只创建一个实例的对象之间有一个重要的区别。你在描述后者。在受保护的构建器的情况下,你说?当在singleton中有受保护的构造函数时?在受保护的构建器的情况下,你说?当在singleton中有受保护的构造函数时
public class Singleton {
private static Singleton singleton;
protected Singleton() {
}
public synchronized static Singleton getInstance() {
if (singleton == null) {
int tipoDoSingletonParaInstanciar = leUmArquivoTexto();
if (tipoDoSingletonParaInstanciar == 1) {
singleton = new SingletonSubclasse1();
} else if(tipoDoSingletonParaInstanciar == 2) {
singleton = new SingletonSubclasse2();
} else {
singleton = new Singleton();
}
}
return singleton;
}
public void metodoQuePodeSerSobrescrito() {
System.err.println("Singleton.metodoQuePodeSerSobrescrito()");
}
}