所以我正在尝试使用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连接工厂的正确方法吗?
答案 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的多个数据库,则将它们存储在哈希表中。