1

我正在开发一个使用示例作为基础的应用程序。向下滚动到名为“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);

我不明白为什么这种方法是静态的。

4

4 回答 4

4

为什么这个方法是静态的?这不能像这样的常规构造函数那样完成吗

基本上第一种方法是使用static factory method. 在这种情况下,可能没有区别。您可以在构造函数中编写相同的代码。好吧,正如@zapl 的评论中所指出的那样,实际上会有一个特定于 Android 的问题。如果您提供自己的参数化构造函数,那么编译器将不会提供默认构造函数。正如注释中所指定的,每个都Fragment必须有一个默认构造函数。

但是,一般来说,使用静态工厂方法有几个好处。他们之中有一些是:

  • 您可以使用静态工厂方法实现单例模式
  • 静态工厂方法可以返回任何子类的实例。

您可以在Effective Java book - Item 1中找到有关此主题的最佳参考,我已在下面链接。

参考:

于 2013-08-16T09:08:16.027 回答
1

在这种情况下,这两种方法都是可能的并且同样好。

于 2013-08-16T09:08:27.617 回答
0

我不确定为什么在创建 DetailsFragment 实例时要创建 Bundle 对象。我们可以在 DetailsFragment 类中将两者分开。

于 2013-08-16T09:10:53.117 回答
0

您可以使用 DetailsFragment(int index) 并且只能由您调用。在您的情况下,这没问题,因为您使用 setArguments 而不是 class-vars。

为什么使用 newInstance 是一种模式?

如果您的操作系统杀死了您的 Fragment,并且下次您的 Fragment 将被恢复,则只会调用 Default-Constructor。操作系统不会再次调用 DetailsFragment(int index)。无论您设置的参数如何,都可以存储在内存中,尽管您的 Fragment 已被杀死一次。

于 2013-08-16T09:12:36.110 回答