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

Kotlin-非单例类的单个实例?,kotlin,Kotlin,我在用Kotlin做一些实验,我在玩单态模式。我想持久化数据库对象的单个实例。就像在Java中一样,我想我应该用一个单件来包装它 import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl import com.github.davidmoten.rx.jdbc.Database object DbManager { val database : Database = Database.from(

我在用Kotlin做一些实验,我在玩单态模式。我想持久化
数据库
对象的单个实例。就像在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())
}
然而,令我惊讶的是,似乎没有内置的方法为它编译getter(比如类的属性)。它直接向世界公开了
数据库
属性,没有任何封装,这是我不想要的

我可以将它私有化,并明确地制定我自己的getter(但我之所以选择Kotlin,是因为我热衷于懒惰)。然而,我想我偶然发现了另一种方法

我可以创建一个Kotlin文件并声明一个私有变量和一个公共函数来安全地封装和公开它,而无需将它放入任何类或单例中

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()
100次。我发现的这个模式是否有效而不是反模式

还有,有没有办法编译getter并封装singleton上的最终属性?还是我自己实施这些方法

我发现的这个模式是否有效而不是反模式

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

还有,有没有办法编译getter并封装singleton上的最终属性?还是我自己实施这些方法

Kotlin属性不仅仅是字段:它们已经为它们生成了getter,因此拥有
数据库和
db()
并不比只拥有
数据库好多少

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

val database: Database
    get() = ...

这只会改变getter的主体,而getter是自动为您生成的

非常感谢Andrey,我很困惑,因为我是从Java代码访问Kotlin类的(它显示了显式getter的互操作性)。当我在straight Kotlin中访问它时,我希望它也是这样。我现在明白了,它就像C#。顺便说一句,再次感谢你编写了这门伟大的语言。这就是我希望Java成为的一切(尤其是来自我的第一语言C#)。