需要关于java中singleton类的信息吗
在我提出这个问题之前,我想提供一个清晰的代码。下面是我的singleton类代码需要关于java中singleton类的信息吗,java,static,singleton,Java,Static,Singleton,在我提出这个问题之前,我想提供一个清晰的代码。下面是我的singleton类代码 public class CoreData { private boolean VarA; private static CoreData instance = null; protected CoreData() { // Exists only to defeat instantiation. } public static CoreData
public class CoreData {
private boolean VarA;
private static CoreData instance = null;
protected CoreData() {
// Exists only to defeat instantiation.
}
public static CoreData getInstance() {
if(instance == null) {
instance = new CoreData();
}
return instance;
}
public boolean getVarA(){
return VarA;
}
public void setFirstTime(boolean B){
VarA = B;
}
}
现在我有几个问题要问
我对java和OOPS非常陌生。我现在正在学习。如果有人能回答我的问题以提高我的知识水平,我将不胜感激。因为你只有一个实例(或者你认为-见下文),让它保持静态不会有任何区别 你的代码不是线程安全的!您可以创建两个实例。原因是,在检查实例为null之后,另一个线程也可以检查并发现它为null——两个线程都将创建实例并返回它们。人们会“逃跑” 传统的方法是“双重检查锁定”,即在同步块内进行检查,但正如Bill Pugh在他的文章中指出的那样,这是一种中断模式。Java1.5引入了
volatile
关键字来解决这个问题,但它仍然是丑陋的代码
初始化实例的现代最佳实践方法是使用以下模式之一:
public class CoreData {
private static class InstanceHolder {
static CoreData INSTANCE = new CoreData();
}
public static CoreData getInstance() {
return InstanceHolder.INSTANCE;
}
}
或
这两种语言都可以保证创建单例,但是enum版本是“铁包子”——可以通过反序列化攻击来影响静态holder类模式中实例的状态。除了那个微小的弱点,这两种方法都有效。我更喜欢代码中的第一个选项,因为它避免了类膨胀
如果将成员变量VarA
设置为static
,会有什么区别
以后要使它成为非独生子女将更加困难
我可以在方法getInstance()
中初始化成员变量吗
嗯。为什么不呢?但实际上,构造函数已经为此完成了
在Singleton类中初始化成员变量的最佳实践是什么
根据最佳实践,您应该使用一些IoC,并且不要在逻辑代码中添加任何关于作用域的代码
把这门课作为期末考试有什么意义
您应该使用private
构造函数而不是protected
一个构造函数,或者将其设置为final
,以防止通过扩展创建多个实例。比如newcoredata(){}代码>
使成员变量为final的含义是什么
我认为默认情况下,所有变量都应该是最终的。此外,它还可以帮助您解决多线程问题。感谢您提出的使其线程安全的建议。这对我来说是一件新事情。你能告诉我如何在getInstance()方法中初始化变量吗。如果我直接将值赋给member,它会告诉我“不能对非静态字段进行静态引用”。@Bohemian,感谢您提供了这篇关于双重检查锁定的好信息和文章。受保护的
构造函数不会破坏实例化(从外部),而私有
就可以了。谢谢您的回答。你能告诉我如何在getInstance()方法中初始化变量吗。如果我直接将值分配给member,它会告诉我一个“不能对非静态字段进行静态引用”@Surjya Narayana Padhi,就像If(instance==null){instance=new CoreData();instance.VarA=false;}
如果默认情况下所有变量都是final,那么它们可能会被称为不同的名称。哦,等等,我知道。。。让我们称之为常数!
public static enum CoreData {
INSTANCE;
// rest of class
}