Использование Singleton в библиотеке комнат Android - PullRequest
0 голосов
/ 30 апреля 2018

Мне всегда говорили, что синглтон - это плохо. Тем не менее, каждый пример реализации Android Room, похоже, использует подход Singleton. Может кто-нибудь объяснить, почему это так?

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Синглтоны считаются злом, потому что неправильное их использование может затруднить тестирование. Если тестируемый код выходит из игры и захватывает статический синглтон, то этот синглтон становится трудным для проверки.

Чтобы смягчить проблему тестирования, ваш код никогда не должен получать синглтона. Всегда принимайте его как параметр конструктора или вставляйте его в структуру DI. Конечно, DI просто перемещает проблему, потому что тогда компонент DI становится единственным, к которому твой код обращается и получает. Но тогда вам нужно только выяснить, как издеваться над компонентом DI, а не кучей других вещей.

В Android Application фактически является одиночным, поскольку для каждой виртуальной машины создается только один экземпляр. Так что это хорошее место для размещения других синглетонов, таких как DI-компонент.

0 голосов
/ 30 апреля 2018

Есть два пути

1) вам следует использовать кинжал 2

2) make метод в абстрактном классе 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();
}
...