我正在开发一个使用this示例作为基础的应用。向下滚动到名为“DetailsFragment”的类。你会看到这个方法:
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
为什么这个方法是静态的?不能这样做像这样的常规构造函数:
public DetailsFragment(int index) {
Bundle args = new Bundle();
args.putInt("index", index);
this.setArguments(args);
}
然后当你需要这个对象时,就去:
DetailsFragment f = new DetailsFragment(somevalue);
我不明白为什么这种方法是静态的。
答案 0 :(得分:4)
为什么这个方法是静态的?这不可能像这样的常规构造函数一样完成
基本上第一种方法是使用static factory method
。在这种情况下,可能没有区别。您可以在构造函数中编写相同的代码。好吧,实际上会有一个特定于Android的问题,正如@zapl在评论中指出的那样。如果您提供自己的参数化构造函数,则编译器将不提供默认构造函数。如注释中所指定,每个Fragment
必须具有默认构造函数。
但是,一般来说,使用静态工厂方法有几个好处。其中一些是:
关于此主题的最佳参考,您可以在 Effective Java book - Item 1 中找到,我已在下面链接。
<强>参考:强>
答案 1 :(得分:1)
在这种情况下,这两种方法都是可行的,同样也很好。
答案 2 :(得分:0)
在创建DetailsFragment的实例时,我不确定为什么要创建Bundle的对象。我们可以在DetailsFragment类中分开。
答案 3 :(得分:0)
您可以使用DetailsFragment(int index),它只能由您调用。在你的情况下,没有问题,因为你使用setArguments而不是class-vars。
为什么使用newInstance是一种模式?
如果您的操作系统终止了Fragment,并且下次还原片段,则只会调用Default-Constructor。操作系统不会再次调用DetailsFragment(int index)。但是,您设置的参数可能会被存储在内存中,尽管您的Fragment已被杀死一次。