在 Android 房间库中使用 Singleton
Using Singleton within the Android Room Library
我一直被告知使用 Singleton 不好。但是,Android Room 实现的每个示例似乎都使用单例方法。谁能解释一下为什么会这样?
谢谢
有两种方式
1 ) 你应该使用匕首 2
2) 抽象 RoomDatabase class 中的 make 方法是 class
提供的对象
示例:
@Database(entities = { Repo.class }, version = 1)
public abstract class RepoDatabase extends RoomDatabase {
private static final String DB_NAME = "repoDatabase.db";
private static volatile RepoDatabase instance;
static synchronized RepoDatabase getInstance(Context context) {
if (instance == null) {
instance = create(context);
}
return instance;
}
private RepoDatabase() {};
private static RepoDatabase create(final Context context) {
return Room.databaseBuilder(
context,
RepoDatabase.class,
DB_NAME).build();
}
public abstract RepoDao getRepoDao();
}
单例被认为是邪恶的,因为滥用它们会使测试变得困难。如果被测试的代码外出并获取静态单例,那么该单例就很难模拟测试。
为了缓解测试问题,您的代码永远不应 get 单例。始终将其作为构造函数参数接收或由 DI 框架注入。当然,DI 只是解决了问题,因为这样 DI 组件就变成了您的代码伸出并获取的单例。但是你只需要弄清楚如何模拟 DI 组件而不是一堆其他东西。
在 Android 上,Application
实际上是一个单例,因为每个 VM 只创建一个实例。所以它是托管其他单例(如 DI 组件)的好地方。
我一直被告知使用 Singleton 不好。但是,Android Room 实现的每个示例似乎都使用单例方法。谁能解释一下为什么会这样?
谢谢
有两种方式
1 ) 你应该使用匕首 2
2) 抽象 RoomDatabase class 中的 make 方法是 class
提供的对象示例:
@Database(entities = { Repo.class }, version = 1)
public abstract class RepoDatabase extends RoomDatabase {
private static final String DB_NAME = "repoDatabase.db";
private static volatile RepoDatabase instance;
static synchronized RepoDatabase getInstance(Context context) {
if (instance == null) {
instance = create(context);
}
return instance;
}
private RepoDatabase() {};
private static RepoDatabase create(final Context context) {
return Room.databaseBuilder(
context,
RepoDatabase.class,
DB_NAME).build();
}
public abstract RepoDao getRepoDao();
}
单例被认为是邪恶的,因为滥用它们会使测试变得困难。如果被测试的代码外出并获取静态单例,那么该单例就很难模拟测试。
为了缓解测试问题,您的代码永远不应 get 单例。始终将其作为构造函数参数接收或由 DI 框架注入。当然,DI 只是解决了问题,因为这样 DI 组件就变成了您的代码伸出并获取的单例。但是你只需要弄清楚如何模拟 DI 组件而不是一堆其他东西。
在 Android 上,Application
实际上是一个单例,因为每个 VM 只创建一个实例。所以它是托管其他单例(如 DI 组件)的好地方。