我正在和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 回答
是的,这是一个有效的模式
Kotlin属性不仅仅是字段:它们已经为它们生成了getter,因此
database
和db()
并不比database
好 .如果您需要稍后更改属性的行为而不重新编译客户端,则可以编写自定义getter:
这将简单地改变为你自动生成的getter的主体