惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Blog — PlanetScale
Blog — PlanetScale
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
L
LangChain Blog
F
Fortinet All Blogs
C
Check Point Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Help Net Security
J
Java Code Geeks
月光博客
月光博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
宝玉的分享
宝玉的分享
Jina AI
Jina AI

博客园 - 陈哈哈

Claude Code Windows 通知配置指南 Windows 上 agent-browser 使用问题排查与解决 踩坑实录:win11中Claude Code MCP 配置 context7 失败与调用问题全排查 Android N 多窗口模式,你需要知道的一切 Mac下设置Android源代码编译环境 Android编译过程中的碎碎念 编译Android AOSP代码 国内不FQ下载Android 源代码 android-plugmgr源代码分析 收集最好的Mac软件和使用方法 为什么使用Binder而不是其他IPC机制 Android什么时候进行View中Background的加载 Android属性动画源代码解析(超详细) Fragment提交transaction导致state loss异常 Android怎么找到最优适配资源 解决在onCreate()过程中获取View的width和Height为0的4种方法 【译】Activitys, Threads和 内存泄露 【译】什么导致了Context泄露:Handler&内部类 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
【译】使用newInstance()来实例化fragment
陈哈哈 · 2014-11-28 · via 博客园 - 陈哈哈

我最近读到StackOverflow上面关于Fragment实例化的一个问题,觉得挺有趣的。

new MyFragment()MyFragment.newInstance()之间的差别是什么?应该用哪个呢?

好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客户端构造对象所需的步骤。例如,考虑下面的代码:

 1 public class MyFragment extends Fragment {
 2 
 3     /**
 4      * 静态工厂方法需要一个int型的值来初始化fragment的参数,
 5      * 然后返回新的fragment到调用者 
 6      */
 7     public static MyFragment newInstance(int index) {
 8         MyFragment f = new MyFragment();
 9         Bundle args = new Bundle();
10         args.putInt("index", index);
11         f.setArguments(args);
12         return f;
13     }
14 }

    不要让客户端去调用默认的构造函数,然后手动地设置fragment的参数。我们直接为它们提供一个静态工厂方法。这样做比调用默认构造方法好,有两个原因:一个是,它方便别人的调用。另一个是,保证了fragment的构建过程不会出错。通过提供一个静态工厂方法,我们避免了自己犯错--我们再也不用担心不小心忘记初始化fragmnet的参数或者没正确设置参数。
    总的来说,虽然两者的区别只在于设计,但是他们之间的差别非常大。因为提供静态工厂方法有向上抽象了一个级别,让代码更容易懂。

    译者注:其实提供静态工厂而不是使用默认构造函数或者自己定义一个有参的构造函数还有至关重要一点。fragmnet经常会被销毁重新实例化,Android framework只会调用fragment无参的构造函数。在系统自动实例化fragment的过程中,你没有办法干预。一些需要外部传入的参数来决定的初始化就没有办法完成。使用静态工厂方法,将外部传入的参数可以通过Fragment.setArgument保存在它自己身上,这样我们可以在Fragment.onCreate(...)调用的时候将这些参数取出来。

原文链接:Using newInstance() to Instantiate a Fragment