在Android会议室中使用Singleton

时间:2018-04-30 15:04:13

标签: android design-patterns android-room android-architecture-components android-livedata

我一直被告知使用Singleton很糟糕。但是,Android Room实现的每个示例似乎都使用Singleton方法。有人可以解释为什么会这样吗?

谢谢

2 个答案:

答案 0 :(得分:2)

有两种方式

1)你应该使用匕首2

2)在抽象的RoomDatabase类中创建方法,它提供了类

的对象

示例:

@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();
}

答案 1 :(得分:2)

单身人士被认为是邪恶的,因为滥用他们会使测试变得困难。如果被测试的代码熄灭并获取静态单例,则该单例变得难以模拟测试。

为了缓解测试问题,您的代码永远不应该获取单例。始终将其作为构造函数参数接收或由DI框架注入。当然,DI只是解决了问题,因为DI组件成为你的代码伸出并获得的单例。但是你只需要弄清楚如何模拟DI组件而不是其他一些东西。

在Android上,Application实际上是一个单例,因为每个VM只创建一个实例。所以这是一个容纳其他单身人士的好地方,比如DI组件。