Kotlin-非单例的单个实例class?

Kotlin- Single instance of a non-singleton class?

我在用 Kotlin 做一些实验,我在玩单例模式。我想保留 Database 对象的单个实例。就像在 Java 中一样,我想我应该围绕它包装一个单身人士。

import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl
import com.github.davidmoten.rx.jdbc.Database

object DbManager {
    val database : Database =
            Database.from(ConnectionProviderFromUrl("jdbc:sqlite:C:/Users/Thomas/OneDrive/Data/finance_rx.db").get())
}

让我吃惊的是似乎没有内置的方法来为它编译 getters(就像 class 的属性)。它只是直接将 database 属性 暴露给世界而没有任何封装,这是我不想要的。

我可以将它设为私有并明确地制作我自己的 getter(但我正在研究 Kotlin,因为我热衷于懒惰)。但是,我想我偶然发现了另一种方法来做到这一点。

我可以创建一个 Kotlin 文件并声明一个私有变量和一个 public 函数来安全地封装和公开它,根本不需要将它放在任何 class 或单例中!

import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl
import com.github.davidmoten.rx.jdbc.Database

private val database : Database =
        Database.from(ConnectionProviderFromUrl("jdbc:sqlite:C:/Users/Thomas/OneDrive/Data/finance_rx.db").get())

fun db(): Database = database;

问题是感觉太简单了。我觉得我在做坏事。但与此同时,这是有道理的。没有人喜欢调用 MySingleton.getInstance().getDb() 一百次。我发现的这个模式有效而不是反模式吗?

另外,有什么办法可以编译getters 并在单例上封装final 属性吗?还是我自己实现这些方法?

Is this pattern I discovered valid and not an anti-pattern?

是的,这是一个有效的模式

Also, is there any way to compile getters and encapsulate final properties on the singleton? Or do I implement those methods myself?

Kotlin 属性不仅仅是字段:它们已经为它们生成了 getter,因此具有 databasedb() 并不比只有 database 更好。

如果您以后需要更改 属性 的行为而不重新编译客户端,您可以编写自定义 getter:

val database: Database
    get() = ...

这只会更改 getter 的正文,否则会自动为您生成