“new A()”和“A.newInstance()”有什么区别?
2022-09-04 02:16:20
我什么时候应该更喜欢一个?下面显示的方法的目的是什么?
class A {
public static A newInstance() {
A a = new A();
return a ;
}
}
有人可以向我解释这两个电话之间的区别吗?
我什么时候应该更喜欢一个?下面显示的方法的目的是什么?
class A {
public static A newInstance() {
A a = new A();
return a ;
}
}
有人可以向我解释这两个电话之间的区别吗?
newInstance()
通常用作实例化对象的一种方式,而无需直接调用对象的默认构造函数。例如,它通常用于实现单例设计模式:
public class Singleton {
private static final Singleton instance = null;
// make the class private to prevent direct instantiation.
// this forces clients to call newInstance(), which will
// ensure the class' Singleton property.
private Singleton() { }
public static Singleton newInstance() {
// if instance is null, then instantiate the object by calling
// the default constructor (this is ok since we are calling it from
// within the class)
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在这种情况下,程序员强制客户端调用以检索类的实例。这很重要,因为只需提供默认构造函数即可允许客户端访问该类的多个实例(这与 Singleton 属性背道而驰)。newInstance()
对于 s,提供静态工厂方法是一种很好的做法,因为我们经常希望将初始化参数添加到新实例化的对象中。与其让客户端调用默认构造函数并手动设置片段参数,不如提供一个方法来为它们执行此操作。例如Fragment
newInstance()
newInstance()
public static MyFragment newInstance(int index) {
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
总的来说,虽然两者之间的差异主要只是设计问题,但这种差异非常重要,因为它提供了另一个抽象级别,并使代码更容易理解。
在您的示例中,它们是等效的,并且没有真正的理由选择其中之一。但是,如果在交还类的实例之前执行一些初始化,则通常使用 newInstance。如果每次通过调用其构造函数来请求类的新实例时,您最终在可以使用该对象之前设置了一堆实例变量,那么让 newInstance 方法执行该初始化并返回给您一个随时可用的对象会更有意义。
例如,s 和 s 不会在其构造函数中初始化。相反,它们通常在 onCreate 期间初始化。因此,newInstance 方法通常接受对象在初始化期间需要使用的任何参数,并将它们存储在 Bundle 中,以便以后从中读取对象。可以在这里看到一个例子:Activity
Fragment