2017-03-27 44 views
0

我試圖創建一個可以被多個類使用的單個數據庫實例(在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<Settings> = db.getCollection<Settings>(TABLE_NAME) 

} 

基本上,我在單例對象中封裝了一個「數據庫容器」,通過對數據庫容器使用延遲初始化並提供指定數據庫名稱的lateinit變量,並在單例對象中具有初始化函數來初始化數據庫容器。這是這樣的,以我的主要方法,當我第一次啓動我的應用程序時,我可以從一些本地屬性文件加載數據庫名稱,並調用val database = DatabaseSingleton.init("DATABASE_NAME", client)來創建我的數據庫單例需要被其他多個類訪問。

這是一個很好的方法來做我想做的事,還是有更好的做事方式?

回答

2

嘗試從系統屬性(或系統環境變量)獲取databaseName。您可以在開始的腳本中設置屬性。

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

謝謝,我將其更改爲在這種情況下的系統性能。 不過,是延遲加載的方法,並遲到一個有效的方法? –