Kotlin-非单例类的单个实例?
我在用Kotlin做一些实验,我在玩单态模式。我想持久化Kotlin-非单例类的单个实例?,kotlin,Kotlin,我在用Kotlin做一些实验,我在玩单态模式。我想持久化数据库对象的单个实例。就像在Java中一样,我想我应该用一个单件来包装它 import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl import com.github.davidmoten.rx.jdbc.Database object DbManager { val database : Database = Database.from(
数据库
对象的单个实例。就像在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(比如类的属性)。它直接向世界公开了数据库属性,没有任何封装,这是我不想要的
我可以将它私有化,并明确地制定我自己的getter(但我之所以选择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()
100次。我发现的这个模式是否有效而不是反模式
还有,有没有办法编译getter并封装singleton上的最终属性?还是我自己实施这些方法
我发现的这个模式是否有效而不是反模式
是的,这是一个有效的模式
还有,有没有办法编译getter并封装singleton上的最终属性?还是我自己实施这些方法
Kotlin属性不仅仅是字段:它们已经为它们生成了getter,因此拥有数据库和db()
并不比只拥有数据库好多少
如果以后需要在不重新编译客户端的情况下更改属性的行为,可以编写自定义getter:
val database: Database
get() = ...
这只会改变getter的主体,而getter是自动为您生成的非常感谢Andrey,我很困惑,因为我是从Java代码访问Kotlin类的(它显示了显式getter的互操作性)。当我在straight Kotlin中访问它时,我希望它也是这样。我现在明白了,它就像C#。顺便说一句,再次感谢你编写了这门伟大的语言。这就是我希望Java成为的一切(尤其是来自我的第一语言C#)。