当我遇到这个时,我正在浏览一段代码:
public class ClassicA {
private static ClassicA instance = null;
}
我从来没有使用过这样的东西,想知道它是什么意思以及它是如何使用的。另外,对象的访问修饰符的目的是什么?欢迎任何示例/链接。
这可能意味着这ClassicA
是一个单例。它通常涉及声明一个私有构造函数和一个公共静态getInstance()
方法。
当您想确保ClassicA
整个应用程序中只有一个全局实例时,可以使用单例。您无需实例化它,而是调用getInstance()
,它将检查它是否被实例化了一次。如果是,它将实例化它,并将结果对象存储在私有instance
字段中。如果它已经被构造,只需返回instance
字段而不重新实例化。
请注意,这被认为是不好的做法。请参阅:https ://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
好吧,这个类ClassicA
有一个私有的静态字段instance
,它是空的。如果没有 getter/setter 访问该字段的唯一方法是使用反射。
由于这看起来像一个单例,我猜还有一个 getter 可以返回instance
,如果它为 null,则首先创建一个实例并将其分配给该字段。
它基本上是一个单例 ,作者打算只有一个此类的实例(实例字段),构造函数可能是私有的并且仅在类中使用。
它是类的(静态)成员,是的,它们可以具有访问修饰符。(正如其他人所指出的,它确实看起来像是单例的一部分。)
这通常用于展示Singleton 设计模式的类。
关键是对于这些类型的对象,您最多只需要一个实例。您所做的是为该类创建一个私有构造函数,然后通常是一个名为 getInstance 的公共静态方法,您可以在其中检查私有实例变量是否已设置。如果尚未设置,则创建该类的新实例并将其分配给实例,然后返回该实例。如果对象已经创建,您只需返回它。像这样:
public class MySingleton {
private static MySingleton instance=null;
private MySingleton() {
//do stuff
}
public static MySingleton getInstance() {
if (instance == null) {
instance = new MySingleton();
}
return instance;
}
}
然后从整个程序中,您可以轻松地从任何地方获取单例对象。
因此,单例实际上只是 PHP 等语言中美化的全局变量。我会争辩说它更干净,因为您可以防止其他人重新分配对实例的引用以及从设计角度来看可能非常糟糕的其他技巧。
通常人们将它用于管理某种类型的数据访问的类,例如 DB 对象,用于工厂类和构建器类,有关更多信息,请参阅此
这用于单例模式。看这里
private static
意味着instance
可用于类的所有实例和静态方法,但仅对它们可用。这实际上就像拥有静态私有方法。
例如,可以使用这些技巧来实现单例:您在内部保留一个类的单个实例,并且可以根据需要将其提供给该类的客户端。或者对于任何其他情况,当您需要在静态方法和某个类的实例之间共享某些东西时。