2

同时将单例实现为:

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

    private MyConnection() {
    }

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

1)为什么我们给connection静态?

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

2)是否有必要声明connection为final?

4

3 回答 3

9

1)为什么我们给connection静态?

如果它是非静态的,则需要有一个实例MyConnection来获取不connection符合目的的引用。:)

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

是的。(既然getConnection()需要是静态的,connection就需要是静态的。)

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

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

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

enum MyConnection {

    INSTANCE;

    // your methods...
}

并通过MyConnection.INSTANCE.

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

于 2012-07-13T10:38:12.840 回答
1

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

因为你希望它是单例的。即使您不是通过静态方法访问它,您也可以访问static variable by making it public and final. 但是,变量必须是静态的。

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

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

但是如果你将单例变量设为 public ,它也必须是 final 的。

于 2012-07-13T10:38:47.810 回答
1

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

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

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

于 2012-07-13T10:44:51.167 回答