当 Fragment.instantiate 优于 MyFragment.newInstance 或 new MyFragment() [重复]

Posted

技术标签:

【中文标题】当 Fragment.instantiate 优于 MyFragment.newInstance 或 new MyFragment() [重复]【英文标题】:When Fragment.instantiate is preferable over MyFragment.newInstance or new MyFragment() [duplicate] 【发布时间】:2014-03-11 09:45:15 【问题描述】:

我正在对其他人的 ViewPager 实现进行代码审查。他有一个属于每个视图的片段类数组。在 getItem(int i) 里面,他会写 MyFragment.newInstance() 我认为没有问题。但是,查看 ViewPager 的 google 文档,他们在示例中使用了 Fragment.instantiate。除了类信息的设置方式之外,使用实例化比调用 newInstance(arg) 或空构造函数有什么设计优势吗?

链接: Fragment.instantiate

【问题讨论】:

你有指向 Fragmnet 类中的 instantiate() 的链接吗? 当我使用 Fragment.instantiate 时,该线程没有回答。我现在没有任何理由使用这种方法,我想知道是否有其他人遇到过他们认为使用实例化是更好选择的情况。 嗯...我从来没有注意到instantiate()。三参数instantiate()的缺点是不能完全解决问题。当它创建实例时,其他一些代码仍然必须填充Bundle,并且该代码必须驻留在某个地方。 newInstance() 风格的工厂方法已经处理了这两者。因此,我也不知道您为什么要使用 instantiate(),除非您已经从其他地方获得了所需的 Bundle(例如,它是来自 Intent 的额外 Bundle )。 IMO 链接的副本不回答这个特定的问题。投票重新开放。 【参考方案1】:

instantiate() 允许您按名称指定片段,而无需在编译时对类进行静态解析。

当片段名称来自一些运行时源时,它很有用,例如二进制 XML:

<fragment class="com.example.FragmentClass" ...

这就是框架实例化布局 XML 中指定的片段的方式。

在代码中,最好使用newInstance() 或空构造函数来进行编译时静态类型检查。

代码instantiate() does under the hood 与使用newInstance() / 空构造函数实例化时发生的情况并没有太大区别,因此在性能上不太可能有显着差异。

【讨论】:

以上是关于当 Fragment.instantiate 优于 MyFragment.newInstance 或 new MyFragment() [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有片段的 Kotlin

XML 何时以及为何优于 CSV? [关闭]

Java:Effective java学习笔记之 接口只用于定义类型类层次优于标签类

MySQL查询优化

ArrayDeque详解

Firefox尝试支持AV1视频压缩编码:文件体积优于HEVC和VP9