【问题标题】:Why is this method static?为什么这个方法是静态的?
【发布时间】:2013-08-18 15:26:53
【问题描述】:

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

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

【问题讨论】:

标签: java android class methods static


【解决方案1】:

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

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

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

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

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

参考:

【讨论】:

  • 还有一个Android特定的原因:每个Fragment都必须有一个无参数的公共构造函数,这样系统才能(重新)创建它们。
  • @zapl。哦!是的,这也是一个重点。一旦我们显式提供了参数化的构造函数,编译器就不会创建默认构造函数。
  • 啊 - 感谢 Rohit 和 zapl。我知道静力学的一些用途,但我没有意识到这是因为 zapl 在这个特定案例中所说的话。我正在努力将本示例中的 DetailsFragment 扩展为三个不同的片段,这些片段可以插入到各自的 ActionBarSherlock 选项卡中。
【解决方案2】:

在这种情况下,这两种方法都是可行的,而且效果一样好。

【讨论】:

  • 抱歉,在您点击提交之前,我编辑删除了“return this” :)(对于那些看到这个的人,我在上面的常规构造函数中有一个 return this)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 2011-10-11
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多