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

Java 为什么这个方法是静态的?,java,android,class,methods,static,Java,Android,Class,Methods,Static,我正在开发一个以示例为基础的应用程序。向下滚动到名为“DetailsFragment”的类。您将看到此方法: public static DetailsFragment newInstance(int index) { DetailsFragment f = new DetailsFragment(); // Supply index input as an argument. Bundle args = new Bundle(); args.putInt("i

我正在开发一个以示例为基础的应用程序。向下滚动到名为“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);
我不明白为什么这个方法是静态的

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

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

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

  • 您可以使用静态工厂方法实现
  • 静态工厂方法可以返回任何子类的实例
关于这个主题,您可以在下面链接的《有效的Java》一书中找到最好的参考资料——第1项

参考资料:

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

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

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

  • 您可以使用静态工厂方法实现
  • 静态工厂方法可以返回任何子类的实例
关于这个主题,您可以在下面链接的《有效的Java》一书中找到最好的参考资料——第1项

参考资料:


这两种方法在本场景中都是可能的,并且同样好。

这两种方法在本场景中都是可能的,并且同样好。

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

我不知道为什么在创建DetailsFragment实例时要创建Bundle的对象。我们可以在详细的片段类中将两者分开

您可以使用DetailsFragment(int-index),并且它只能由您调用。在您的例子中,这没有问题,因为您使用setArguments而不是类vars

为什么使用newInstance是一种模式


如果您的操作系统杀死了您的片段,并且下次将恢复您的片段,则只会调用默认构造函数。操作系统将不会再次调用DetailsFragment(int index)。然而,您设置的参数可能会存储在内存中,尽管您的片段已经被杀死过一次

您可以使用DetailsFragment(int-index),并且它只能由您调用。在您的例子中,这没有问题,因为您使用setArguments而不是类vars

为什么使用newInstance是一种模式


如果您的操作系统杀死了您的片段,并且下次将恢复您的片段,则只会调用默认构造函数。操作系统不会再次调用DetailsFragment(int索引)。然而,您设置的参数可能会存储在内存中,尽管您的片段已经被杀死过一次

相关:相关:还有一个特定于Android的原因:每个
片段都必须有一个无参数公共构造函数,这样系统才能(重新)创建它们。@zapl。哦是的,这也是一点。一旦我们显式地提供了一个参数化的构造函数,编译器就不会创建默认构造函数。啊-感谢Rohit和zapl。我知道静力学的一些用途,但我没有意识到这是因为zapl在这个具体案例中所说的。我正在将本例中的DetailsFragment扩展为三个不同的片段,可以插入相应的ActionBarSherlock选项卡。还有一个Android特定的原因:每个
片段必须有一个无参数公共构造函数,以便系统可以(重新)创建它们。@zapl。哦是的,这也是一点。一旦我们显式地提供了一个参数化的构造函数,编译器就不会创建默认构造函数。啊-感谢Rohit和zapl。我知道静力学的一些用途,但我没有意识到这是因为zapl在这个具体案例中所说的。我正在将本例中的DetailsFragment扩展为三个不同的片段,可以插入相应的ActionBarSherlock选项卡。抱歉,我编辑并删除了“return this”,然后点击submit:)(对于那些看到这一点的人,我在上面的常规构造函数中有一个return this)抱歉,我编辑并删除了“return this”,在点击提交之前:)(对于那些看到这一点的人,我在上面的常规构造函数中返回了这一点)