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和封装最后的属性在单身人士? 还是我自己实施这些方法?
我发现这种模式是否有效,而不是反模式?
是的,这是一个有效的模式
另外,是否有任何方法来编译getter和封装最后的属性在单身人士? 还是我自己实施这些方法?
Kotlin属性不仅仅是字段:它们已经为它们生成了getter,所以拥有database
和db()
并不比database
。
如果以后需要更改属性的行为而不重新编译客户端,则可以编写一个自定义的getter:
val database: Database get() = ...
这只会改变自动为您生成的吸气体的主体