调用Class.getInstance()
是否等同于new Class()
?
我知道构造函数是针对后者调用的,但是getInstance()
呢?
感谢。
答案 0 :(得分:24)
没有Class#getInstance()
这样的方法。您可能会将其与Class#newInstance()
混淆。是的,这与默认构造函数上的new
完全相同。以下是Javadoc的摘录:
创建由此
Class
对象表示的类的新实例。 该类被实例化为好像是带有空参数列表的new
表达式。如果类尚未初始化,则初始化该类。
在代码中,
Object instance = Object.class.newInstance();
与
相同Object instance = new Object();
Class#newInstance()
调用实际上遵循Factory Method模式。
更新:看到其他答案,我意识到你的问题有些含糊不清。好吧,使用方法实际上名为getInstance()
的地方通常表示Abstract Factory模式。它将“在引擎盖下”使用new
或Class#newInstance()
来创建并返回感兴趣的实例。它只是隐藏了您可能不需要了解的具体实现的所有细节。
此外,您还会在Singleton模式的某些(主要是自行开发的)实现中看到此方法名称。
答案 1 :(得分:5)
绝对(通常)不是。
getInstance
是Java中Singleton Pattern常用的静态方法。 new
关键字实际上会创建一个新对象。在某些时候,必须有new
(尽管还有一些其他方法可以实例化新对象)来实际创建getInstance
返回的对象。
答案 2 :(得分:5)
在抽象类的上下文中,getInstance()
方法可能代表factory method pattern。一个例子是抽象Calendar
类,它包括静态工厂方法和一个具体的子类。
答案 3 :(得分:2)
某些抽象类具有getInstance()方法,因为您不能使用new关键字实例化一个抽象类。
答案 4 :(得分:1)
是的,这通常用于Singleton Pattern。当你只需要一个类的一个实例时使用它。 使用getInstance()是首选,因为此方法的实现可能会检查是否存在类的活动实例并返回它而不是创建新实例。它可以节省一些内存。就像在这个例子中一样:
public static DaoMappingManager getInstance() {
DaoProperties daoProperties = null;
try {
daoProperties = (DaoProperties) DaoProperties.getInstance();
} catch (PropertyException e) {
e.printStackTrace();
}
return getInstance(daoProperties);
}
public static DaoMappingManager getInstance(DaoProperties daoProperties) {
if (instance == null) {
instance = new DaoMappingManager(daoProperties);
}
return instance;
}
答案 5 :(得分:0)
首先:
newInstance()
是static method
。这意味着您无需直接创建新类就可以访问它!并且它“通过必要的初始化”(通过内部new myClass()
)创建该类本身。这意味着您可以添加一些newInstance
方法(newInstance4usage1,newInstance4usage2等)来满足不同的需求,每个静态方法创建具有不同初始化的类。
有时,这可以帮助类的用户(最终程序员)创建类而无需担心并且非常自在。
当初始化过程很复杂或具有重要或通常水平时,这确实有帮助。此方法不会阻止通过new
关键字创建类。
我喜欢!
不好意思,我正在用手机打字!