调用new和getInstance()之间的区别
调用Class.getInstance()
等同于new Class()
? 我知道构造函数是为后者调用的,但是getInstance()
呢? 谢谢。
没有Class#getInstance()
这样的方法。 你可能会把它与Class#newInstance()
混淆。 是的,这与默认构造函数中的new
完全相同。 这是它的Javadoc的摘录:
创建此
Class
对象表示的类的新实例。 该类实例化为具有空参数列表的new
表达式。 如果尚未初始化,则初始化该类。
在代码中,
Object instance = Object.class.newInstance();
是相同的
Object instance = new Object();
Class#newInstance()
调用实际上遵循Factory Method模式。
更新 :看到其他答案,我意识到你的问题有些含糊不清。 好吧,使用实际命名为getInstance()
的方法的地方通常表示抽象工厂模式。 它将“在引擎盖下”使用new
或Class#newInstance()
来创建并返回感兴趣的实例。 它只是隐藏了您可能不需要了解的具体实现的所有细节。
此外,您还会在Singleton模式的某些(主要是自行开发的)实现中看到此方法名称。
也可以看看:
- GoF设计模式的真实世界示例。
绝对(通常)不是。
getInstance
是Java中Singleton Pattern常用的静态方法。 new
关键字实际上创建了一个新对象。 在某些时候,必须有一个new
(尽管有一些其他方法来实例化新对象)来实际创建getInstance
返回的对象。
在抽象类的上下文中, getInstance()
方法可以表示工厂方法模式 。 一个例子是抽象的Calendar
类,它包含静态工厂方法和具体的子类。
一些抽象类具有getInstance()方法,因为您无法使用new关键字实例化抽象类。
是的,这通常用于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; }
首先: newInstance()
是一个static method
。 这意味着您无需直接创建新类即可访问它! 它创建了这个类本身“有必要的inits”(通过内部new myClass()
)。 这意味着您可以为每个静态方法创建具有不同初始化的类的不同需求添加一些newInstance
方法(newInstance4usage1,newInstance4usage2,…)。 有时,这有助于class级的用户(最终程序员)创建课程而不用担心和非常舒服。
当init过程很复杂或具有重要或常用级别时,这确实有帮助。 此方法不会阻止通过new
关键字创建类。
我喜欢!
请原谅我慢慢回答,我正用手机打字!