使用kotlin创建数据库工厂

时间:2018-02-04 12:28:21

标签: kotlin factory-pattern companion-object

所以我正在尝试使用kotlin创建一个MongoDB工厂......但我认为我并不是很了解companion object的概念,因为我甚至无法编译它:

package org.jgmanzano.storage

import com.mongodb.MongoClient
import com.mongodb.MongoClientURI
import com.mongodb.client.MongoDatabase

class MongoConnectionFactory(private val connectionURI: String) {
    private var database: MongoDatabase

    init {
        val connectionString = MongoClientURI(connectionURI)
        val mongoClient = MongoClient(connectionString)
        database = mongoClient.getDatabase("paybotDB")
    }

    companion object {
        fun getDatabase() : MongoDatabase {
            return database
        }
    }
}

你们如何实现这一目标?我的想法是在Java中创建一种工厂方法。我似乎无法正确理解语法。

此外,这是DB连接工厂的正确方法吗?

1 个答案:

答案 0 :(得分:2)

将所有内容移动到协同对象,将连接URI传递给getDatabase方法。 Companion对象被编译为包含(外部类)内的静态字段。由于该字段是静态的,因此它不能访问外部类的字段,因为外部类是一个实例。

我假设您要缓存数据库对象。

class MongoConnectionFactory() {

    companion object {
        private var database: MongoDatabae? = null

        fun getDatabase(connectionURI: String) : MongoDatabase {
            if (database != null) {
                return database
            {
            val connectionString = MongoClientURI(connectionURI)
            val mongoClient = MongoClient(connectionString)
            database = mongoClient.getDatabase("paybotDB")
            return database
        }
    }
}

但是你不需要嵌套在包含类的内部的伴随对象。 您可以改为创建一个对象。

object MongoConnectionFactory {
    private var database: MongoDatabae? = null

    fun getDatabase(connectionURI: String) : MongoDatabase {
        if (database != null) {
            return database
        {
        val connectionString = MongoClientURI(connectionURI)
        val mongoClient = MongoClient(connectionString)
        database = mongoClient.getDatabase("paybotDB")
        return database
    }
}

如果您需要具有不同连接URI的多个数据库,则将它们存储在哈希表中。