我知道如何在两个月开始学习时在java中创建变量/类成员,但是在下面的代码片段中,第一个私有变量(实例)创建如下:< / p>
私有静态 StaticBlockSingleton 实例;
public class StaticBlockSingleton {
private static StaticBlockSingleton instance;
private StaticBlockSingleton(){}
//static block initialization for exception handling
static{
try{
instance = new StaticBlockSingleton();
}catch(Exception e){
throw new RuntimeException("Exception occured in creating singleton instance");
}
}
public static StaticBlockSingleton getInstance(){
return instance;
} }
在创建私有静态变量(实例)时,为什么使用类名( StaticBlockSingleton ),这是什么概念?它是如何运作的。
感谢您对此的指导。
附加要点:
补充一点:我不是在问静电&#39;静电&#39;关键字在这里,我问的是用作变量或方法的类型的类名。
使用类名作为成员的TYPE(变量/方法)是非常特殊的目的吗?
假设我们使用String类型作为实例变量或getInstance()方法,我们仍然无法实现单例功能,因为我们将调用getInstance()?
不确定我在这里是否缺少任何概念......
答案 0 :(得分:1)
private static StaticBlockSingleton instance;
这是使用instance
StaticBlockSingleton
private StaticBlockSingleton(){}
这是声明一个空构造函数,并将其标记为私有,因此只有类本身可以创建一个新实例
//static block initialization for exception handling
static{
try{
instance = new StaticBlockSingleton();
}catch(Exception e){
throw new RuntimeException("Exception occured in creating singleton instance");
}
}
这是一个静态初始化程序块,在加载类时将运行一次,并创建一个实例并将其分配给instance
变量
此处的异常处理很糟糕,因为您丢失了有关异常发生原因的任何信息,这些信息将存储在Exception e
中,并且通常最好尽量使用Exception类型尽可能具体(例如FileNotFoundException
代替IOException
)
静态初始化程序块是不必要的,因为空构造函数不会抛出异常,因此第一行应该更改为
private static StaticBlockSingleton instance=new StaticBlockSingleton();
并删除静态初始化程序块。
最后
public static StaticBlockSingleton getInstance(){
return instance;
}
这是一个公开的公共方法,用于返回instance
变量。因为类的构造函数是私有的,并且实例是静态的,所以整个代码库只有一个实例
答案 1 :(得分:0)
由于变量的名称暗示:
private static StaticBlockSingleton instance;
您正在查看的是sigleton模式,它可以保证您只有一个特定类的单个实例。这就是为什么构造函数是私有的:
private StaticBlockSingleton(){}
这会强制在静态初始值设定项中创建此类的唯一实例:
static{
try{
instance = new StaticBlockSingleton();
}catch(Exception e){
throw new RuntimeException("Exception occured in creating singleton instance");
}
}
因此所有其他类只会使用getInstance()
方法获取现有实例,如下所示:
StaticBlockSingleton.getInstance().someMethod();
您可以在Wikipedia
中详细了解相关信息