将单例实现为:
class MyConnection {
private static MyConnection connection = new MyConnection();
private MyConnection() {
}
public static MyConnection getConnection() {
return connection;
}
}
1)为什么我们将connection
作为静态?
这只是因为getConnection()
是静态的,我们不能在静态上下文中引用非静态或者还有其他原因吗?
2)是否有必要将connection
声明为最终?
答案 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)你不需要宣布它是最终的,但是宣布任何可以是最终的,最终的是好的形式。这样你就明确了你的意图,如果你犯了错误,编译器可以帮助你。它应该至少最终或私有。