Kotlin-非单身类的单一实例?

tmn*_*tmn 3 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())
}
Run Code Online (Sandbox Code Playgroud)

然而令我感到惊讶的是,似乎没有内置的方法来为它编译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;
Run Code Online (Sandbox Code Playgroud)

事情是它感觉太容易了.我觉得我做得不好.但与此同时,这是有道理的.没有人喜欢打MySingleton.getInstance().getDb()一百次.这种模式我发现有效而不是反模式吗?

另外,有没有办法编译getter并封装单例的最终属性?或者我自己实施这些方法?

And*_*lav 9

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

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

另外,有没有办法编译getter并封装单例的最终属性?或者我自己实施这些方法?

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

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

val database: Database
    get() = ...
Run Code Online (Sandbox Code Playgroud)

这将简单地改变为你自动生成的getter的主体