Объект базы данных Singleton с параметризованной инициализацией при запуске?

Я пытаюсь создать единый экземпляр базы данных, который может использоваться несколькими классами (используя ключевое слово object в Котлине). Однако я хотел бы указать имя базы данных до создания экземпляра singleton.

Поскольку одноэлементный объект не может быть инициализирован параметром, мне было интересно, действительно ли то, что я делаю, или если есть лучший способ делать вещи:

 object DatabaseSingleton { private lateinit var databaseName: String private lateinit var mongoClient: MongoClient val database: DatabaseContainer by lazy { DatabaseContainer(databaseName, mongoClient) } fun init(databaseName: String, mongoClient: MongoClient): DatabaseSingleton { this.databaseName = databaseName this.mongoClient = mongoClient return this } } 

И в другом файле

 class DatabaseContainer(databaseName: String, val mongoClient: MongoClient) { val db: MongoDatabase = mongoClient.getDatabase(databaseName) val table: MongoCollection<Settings> = db.getCollection<Settings>(TABLE_NAME) } 

В принципе, я инкапсулирую «контейнер базы данных» в одноэлементный объект, используя ленивую инициализацию для контейнера базы данных и предоставляя запаздывающие вары для указания имени базы данных и имеющие функцию инициализации в объекте singleton для инициализации контейнера базы данных. Это связано с тем, что в моем основном методе при первом запуске приложения я могу загрузить имя базы данных из некоторого файла локальных свойств и вызвать val database = DatabaseSingleton.init("DATABASE_NAME", client) чтобы создать мой синглтон базы данных, который должен доступ к ним осуществляется несколькими другими классами.

Является ли это хорошим подходом для того, чтобы делать то, что я хочу, или есть лучшие способы сделать что-то?

попробуйте получить имя базы данных из системного свойства (или переменной системной среды). Вы можете установить свойство в своем стартовом скрипте.

например: java -DdatabaseName=databaseA ....

 object DatabaseSingleton { private const var DB_NAME_SYS_KEY = "databaseName" private lateinit var databaseName: String private lateinit var mongoClient: MongoClient val database: DatabaseContainer by lazy { DatabaseContainer(databaseName, mongoClient) } fun init(mongoClient: MongoClient): DatabaseSingleton { this.databaseName = System.getProperty(DB_NAME_SYS_KEY) this.mongoClient = mongoClient return this } } 
Intereting Posts
Как умножить nullsafe float в котлин? Как изменить правила подсветки синтаксиса для переменной с модификатором lateinit в IntelliJ (Kotlin)? Отражающая функция вызова и использование параметров по умолчанию Весенний кеш загрузки не поддерживает kotlin? Как упаковать родную библиотеку kotlin, чтобы ее можно было использовать в проектах Android и iOS? Android Kotlin – Невозможно планировать уведомление для будущей даты с помощью диспетчера аварийных сигналов Как запретить вызовы функций с определенным подтипом типа параметра? заполнять прядильщик с модифицированным и моши Как отобразить Список << MyClass> в список <T>? Растровое изображение холста?) Аномальное завершение процесса сборки в IntelliJ IDEA на Linux Mint Список связанных со списком в Котлине TornadoFX – удалить элемент с помощью контекстного меню правой кнопкой мыши Как долго свойство String может находиться в Котлине? Предупреждение компилятора при использовании аннотации @Value в проекте Kotlin