为什么这个方法是静态的?

时间:2013-08-16 09:04:55

标签: java android class methods static

我正在开发一个使用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);

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

4 个答案:

答案 0 :(得分:4)

  

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

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

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

  • 您可以使用静态工厂方法
  • 实施singleton pattern
  • 静态工厂方法可以返回任何子类的实例。

关于此主题的最佳参考,您可以在 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已被杀死一次。