在启动时使用参数化初始化的单例数据库对象?

我试图创建一个可以被多个类使用的单个数据库实例(在Kotlin中使用object关键字)。 但是,我希望能够在创建单例实例之前指定数据库名称。

由于单例对象不能用参数初始化,所以我想知道我在做什么是有效的,或者是否有更好的方法来做事情:

 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 = db.getCollection(TABLE_NAME) } 

基本上,我通过使用数据库容器的延迟初始化来封装单个对象中的“数据库容器”,并提供指定数据库名称的lateinitvariables,并在单例对象中具有初始化函数来初始化数据库容器。 这是在我的主要方法,当我第一次启动我的应用程序,我可以从一些本地属性文件加载数据库名称,并调用val database = DatabaseSingleton.init("DATABASE_NAME", client)来创建我的数据库单例需要被多个其他类访问。

这是做我想做的一个好方法,还是有更好的做事方式?

尝试从系统属性(或系统环境variables)获取数据库名称。 您可以在开始的脚本中设置属性。

例如: 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 } }