在单例中声明变量static

时间:2012-07-13 10:35:07

标签: java singleton

将单例实现为:

class MyConnection {
    private static MyConnection connection = new MyConnection();

    private MyConnection() {
    }

    public  static MyConnection getConnection() {
        return connection;
    }
}

1)为什么我们将connection作为静态?

这只是因为getConnection()是静态的,我们不能在静态上下文中引用非静态或者还有其他原因吗?

2)是否有必要将connection声明为最终?

3 个答案:

答案 0 :(得分:9)

  

1)为什么我们将connection视为静态?

如果它是非静态的,你需要有一个MyConnection的实例来获取connection引用,这样会破坏目的。 :)

  

这只是因为getConnection()是静态的,我们无法在静态环境中引用非静态或有任何其他原因吗? < / p>

是。 (由于getConnection()需要是静态的,connection必须是静态的。)

  

2)是否有必要将连接声明为最终?

不,但这是一种很好的做法,因为一旦初始化,就不应该改变它。

但是,更好的做法是使用enum代替。

enum MyConnection {

    INSTANCE;

    // your methods...
}

并通过MyConnection.INSTANCE访问它。

经验法则:如果某个类具有预定义数量的实例,请使用enum。在这种情况下,实例数是一个。

答案 1 :(得分:1)

1)为什么我们将连接设为静态?

因为你想让它成为单身人士。即使您没有通过静态方法访问它,也可以访问static variable by making it public and final。但是,变量必须是静态的。

2)是否有必要将连接声明为最终?

如果您通过代码中的静态方法进行访问,则不需要,因为它不会暴露在外部以进行修改。

但是如果你将单例变量公之于众,那么它也必须是最终的。

答案 2 :(得分:1)

Singleton是一个你只有一个实例的类。在Java中,实现该模式的最常用方法是声明private构造函数以防止正常初始化,并使用public static方法来提供单个实例。 (但是aioobe的枚举答案很酷!)

可以在没有类实例的情况下调用静态方法,允许您执行MySingleton.getInstance()之类的操作 - 但是,由于您无法保证拥有该类的实例,因此无法访问该实例变量。通过将变量声明为static,您将其声明为“类变量” - 允许以与静态方法相同的方式访问它,并允许静态方法访问它(同样,静态方法无法访问非 - 静态变量,因为不能保证它们存在,我们也不会知道要查看哪个实例)。所以回答1)这是因为如果你需要一个单例的实例来查找单例的实例,你就有了一个捕获22。

至于2)你不需要宣布它是最终的,但是宣布任何可以是最终的,最终的是好的形式。这样你就明确了你的意图,如果你犯了错误,编译器可以帮助你。它应该至少最终私有。