单例和上下文
Singleton and Context
我已经开始使用 Android Big Nerd Ranch 指南学习 android。
清单 9.1 设置单例 (CrimeLab.java)
public class CrimeLab {
private static CrimeLab sCrimeLab;
private Context mAppContext;
private CrimeLab(Context appContext) {
mAppContext = appContext;
}
public static CrimeLab get(Context c) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(c.getApplicationContext());
}
return sCrimeLab;
}
}
项目 - 我们正在创建犯罪对象列表,我们使用此 class 来存储列表。
我无法理解清单 9.1 中提供的单例 class 的需要。为什么我们首先需要这个 class?为什么我们需要一个上下文变量,它包含什么?
我搜索了 google 并发现上下文用于通知应用程序的其他部分正在发生的事情。但是,我不太明白我们要通知 CrimeLab 什么?我们可以创建没有单例的 crimeLab class 吗?如果是,为什么我们将 crimeLab 用作单例 class?
单例是 class 最多只有一个实例。因此私有构造函数和 public static get.
public 静态获取通常是无参数的。原因是如果使用不同的参数调用,那么调用的顺序会导致单例初始化不同,因此容易出现竞争条件。
在没有更多上下文的情况下,我只能得出这样的代码是错误的结论。
这不是Android的问题,它只是一种设计模式本身。
我已经在 Android Big Nerd Ranch 指南中阅读了这个示例。清单 9.1 设置单例 (CrimeLab.java) 以及将其设置为单例的原因描述为我们要存储 shared 数据。想象一下,当我们在 2 个地方构造没有单例的 CrimeLab 对象时:
CrimeLab cb1 = new CrimeLab(context);
CrimeLab cb2 = new CrimeLab(context);
创建新的对象,cb1和cb2中存储的数据不同
假设您在应用程序中使用数据库,它应该只有一个?是的
但为了相同的目的(单一数据位置),我们可以使用静态方法或属性,但您需要通过隐藏构造函数来防止创建对象
private CrimeLab(Context appContext) {
mAppContext = appContext;
}
我已经开始使用 Android Big Nerd Ranch 指南学习 android。 清单 9.1 设置单例 (CrimeLab.java)
public class CrimeLab {
private static CrimeLab sCrimeLab;
private Context mAppContext;
private CrimeLab(Context appContext) {
mAppContext = appContext;
}
public static CrimeLab get(Context c) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(c.getApplicationContext());
}
return sCrimeLab;
}
}
项目 - 我们正在创建犯罪对象列表,我们使用此 class 来存储列表。
我无法理解清单 9.1 中提供的单例 class 的需要。为什么我们首先需要这个 class?为什么我们需要一个上下文变量,它包含什么?
我搜索了 google 并发现上下文用于通知应用程序的其他部分正在发生的事情。但是,我不太明白我们要通知 CrimeLab 什么?我们可以创建没有单例的 crimeLab class 吗?如果是,为什么我们将 crimeLab 用作单例 class?
单例是 class 最多只有一个实例。因此私有构造函数和 public static get.
public 静态获取通常是无参数的。原因是如果使用不同的参数调用,那么调用的顺序会导致单例初始化不同,因此容易出现竞争条件。
在没有更多上下文的情况下,我只能得出这样的代码是错误的结论。
这不是Android的问题,它只是一种设计模式本身。 我已经在 Android Big Nerd Ranch 指南中阅读了这个示例。清单 9.1 设置单例 (CrimeLab.java) 以及将其设置为单例的原因描述为我们要存储 shared 数据。想象一下,当我们在 2 个地方构造没有单例的 CrimeLab 对象时:
CrimeLab cb1 = new CrimeLab(context);
CrimeLab cb2 = new CrimeLab(context);
创建新的对象,cb1和cb2中存储的数据不同
假设您在应用程序中使用数据库,它应该只有一个?是的
但为了相同的目的(单一数据位置),我们可以使用静态方法或属性,但您需要通过隐藏构造函数来防止创建对象
private CrimeLab(Context appContext) {
mAppContext = appContext;
}