Kotlin – Лучший способ конвертировать Singleton DatabaseController в Android

Я изучаю Kotlin из «Kotlin in Action», и я медленно конвертирую код приложения Android в него. Но я нашел проблему в преобразовании следующего класса.

public class DatabaseController { private static DatabaseController sDatabaseController; private SQLiteDatabase mDatabase; private DatabaseController(Context context) { mDatabase = new SQLiteOpenHelperImpl(context.getApplicationContext()) .getWritableDatabase(); } public static DatabaseController getDatabaseController(Context context) { if (sDatabaseController == null) { sDatabaseController = new DatabaseController(context); } return sDatabaseController; } public void addElement(Element element) { if (element != null) { ContentValues values = getContentValues(element); mDatabase.beginTransaction(); try { // insert element mDatabase.setTransactionSuccessful(); } finally { mDatabase.endTransaction(); } } } 

Я придумал две разные реализации Котлина, но ни один из них не полностью меня убедил. Какой из них можно считать лучшим решением? Или существует третий, который лучше?

Первая реализация с использованием объекта

 object DatabaseControllerObject { private var mDatabase : SQLiteDatabase? = null fun initDatabase(context: Context) { mDatabase = mDatabase?: SQLiteOpenHelperImpl(context.applicationContext).writableDatabase } fun addElement(context: Context, element: Element) { initDatabase(context) // insert alarm mDatabase?.let { // CODE } } 

Вторая реализация со всем в одном файле, где я вызываю initDatabase (..) в onCreate () каждого действия, которому нужна база данных

 private var mDatabase: SQLiteDatabase? = null fun initDatabase(context: Context) { mDatabase = mDatabase ?: SQLiteOpenHelperImpl(context.applicationContext).writableDatabase } fun addElement(element: Element) { val values = getContentValues(element) mDatabase?.let { it.beginTransaction() try { // insert it.setTransactionSuccessful() } finally { it.endTransaction() } } } 

Я думаю, что вы хотите, это сопутствующий объект:

 class DatabaseController { private constructor(context: Context) { // ... } companion object { private var instance: DatabaseController? = null fun getInstance(context: Context): DatabaseController { if(instance == null) { instance = DatabaseController(context) } return instance!! } } } 

Тогда вы можете просто называть это следующим образом:

 val databaseController = DatabaseController.getInstance(context) 
Intereting Posts
Клавиатура скрывает BottomSheetDialogFragment Второй экземпляр приложения создается с Android 7.0. Как я могу избежать этого? Где / Как вы добавляете документацию для пакетов Kotlin? Тип общего типа Kotlin, Ошибка ввода типа Как исправить мой код, чтобы удалить предупреждение о литье? Ошибка: выполнение выполнено для задачи ': app: kaptDemoTestingDebugKotlin' Kotlin: Как я могу избежать автобоксинга (мусора) в делегированных свойствах? Резервирование проекции Котлина Как смешивать несколько конструкторов родительского класса с val в дочернем классе Почему этот способ случайного создания графика несправедлив? Как вызвать конструктор String Java (char , int offset, int length) из Kotlin? андроидный статический старт-метод активности в Котлине В чем разница между () -> единицей и (единицей) -> типами единиц? Что отличает <reified T> от <reified T: Any> в Котлине? Как получить текущую локальную дату и время в Котлин