IN SHORT
Короче говоря, оба кода практически одинаковы.Они проверяют значение переменной-члена.Если значение уже существует, просто верните это значение, не создавая новый объект.Иначе, если значение переменной равно нулю, в этом случае создайте новый объект, назначьте объект переменной-члену и затем верните значение.
IN LONG
Оба кода, которые вы упомянули, предназначены только для реализации Singleton Pattern .Для этого есть несколько способов:
хранилище android-архитектура-компонентов
AppDatabase database = AppDatabase.getInstance(appContext, executors);
В приведенном выше коде мы вызываем метод getInstance(.. , ..)
, которыйреализует шаблон синглтона следующими способами:
public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = buildDatabase(context.getApplicationContext(), executors);
sInstance.updateDatabaseCreated(context.getApplicationContext());
}
}
}
return sInstance;
}
Метод getInstance()
не всегда создает новый объект .Вместо этого он проверяет значение переменной-члена sInstance
.Если значение равно null
, присвойте ему значение объекта БД, а затем верните значение.А в случае, если значение не равно нулю, просто верните уже сохраненное значение, т.е. значение предыдущего объекта БД.
android-room-with-a-view репозиторий
Он также делает то же самое, то есть использует одно и то же значение синглтона INSTANCE
и передает его новому объекту AsyncTask .
new PopulateDbAsync(INSTANCE).execute();
Одиночный узор
static WordRoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (WordRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
WordRoomDatabase.class, "word_database")
// Wipes and rebuilds instead of migrating if no Migration object.
// Migration is not part of this codelab.
.fallbackToDestructiveMigration()
.addCallback(sRoomDatabaseCallback)
.build();
}
}
}
return INSTANCE;
}