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

我正在和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()) } 

然而令我惊讶的是,似乎没有为它编译getter的内置方式(比如类的属性)。 这只是直接揭露database属性到世界上没有任何封装,我不想要的。

我可以把它变成私人的,明确地制造我自己的吸气剂(但是我正在看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()一百次。 我发现这种模式是否有效,而不是反模式?

另外,是否有任何方法来编译getter和封装最后的属性在单身人士? 还是我自己实施这些方法?

我发现这种模式是否有效,而不是反模式?

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

另外,是否有任何方法来编译getter和封装最后的属性在单身人士? 还是我自己实施这些方法?

Kotlin属性不仅仅是字段:它们已经为它们生成了getter,所以拥有databasedb()并不比database

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

 val database: Database get() = ... 

这只会改变自动为您生成的吸气体的主体