首页 文章

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

提问于
浏览
3

我正在和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并封装单例的最终属性?或者我自己实施这些方法?

1 回答

  • 9

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

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

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

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

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

    val database: Database
        get() = ...
    

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

相关问题