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

时间:2015-11-17 01:47:56

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

1 个答案:

答案 0 :(得分:9)

  

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

是的,它是一种有效的模式

  

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

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

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

val database: Database
    get() = ...

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