我正在和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并封装单例的最终属性?或者我自己实施这些方法?
答案 0 :(得分:9)
我发现这种模式是否有效而不是反模式?
是的,它是一种有效的模式
此外,有没有办法编译getter并封装单例的最终属性?或者我自己实施这些方法?
Kotlin属性不仅仅是字段:它们已经为它们生成了getter,因此database
和db()
并不比database
好。
如果您需要稍后更改属性的行为而不重新编译客户端,则可以编写自定义getter:
val database: Database
get() = ...
这将简单地改变为你自动生成的getter的主体