2012-07-13 106 views
1

而实现单为:声明静态变量在单

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

    private MyConnection() { 
    } 

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

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

这是否只是由于getConnection()是静态的,我们不能在静态环境中引用非静态或者还有其他原因?

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

回答

9

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

如果是无静电,你需要有MyConnection一个实例来获取connection参考哪种类型的失败的目的的保持。 :)

这不仅是因为这样的事实,getConnection()是静态的,我们不能引用非静态的静态背景下或有其他原因?

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

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

没有,但它是很好的做法,因为一旦被初始化,它不应该被改变。

但是,甚至更​​好的做法是使用enum来代替。

enum MyConnection { 

    INSTANCE; 

    // your methods... 
} 

并通过MyConnection.INSTANCE访问它。

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

+0

对于枚举+1:http://stackoverflow.com/questions/427902/what-is-the-best-approach-for-using-an-enum-as-a-singleton-in-java – 2012-07-13 10:40:25

+2

也,如果每次创建“MyConnection”时创建一个新的“MyConnection”,则会很快耗尽内存...... – Keppil 2012-07-13 10:41:07

+0

另请参阅:http://stackoverflow.com/questions/70689/what-is-an -efficient-way-to-implement -a-singleton-pattern-in-java – assylias 2012-07-13 10:43:34

1

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

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

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

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

但是,如果你的单变量公众,它必须是最后的也是。

+0

'但是如果你让单身变量公开,它也必须是final的。 – 2012-07-14 07:44:34

1

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

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

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