Java:Classes&变量

时间:2017-06-26 15:11:17

标签: java variables instance

我知道如何在两个月开始学习时在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()?

不确定我在这里是否缺少任何概念......

2 个答案:

答案 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

中详细了解相关信息