Kotlin – 在Android中转换Singleton DatabaseController的最佳方法

我正在从“Kotlin in Action”学习Kotlin,并且正在慢慢将Android应用程序代码转换为它。 但是我在转换下面的课程时发现了一些问题。

public class DatabaseController { private static DatabaseController sDatabaseController; private SQLiteDatabase mDatabase; private DatabaseController(Context context) { mDatabase = new SQLiteOpenHelperImpl(context.getApplicationContext()) .getWritableDatabase(); } public static DatabaseController getDatabaseController(Context context) { if (sDatabaseController == null) { sDatabaseController = new DatabaseController(context); } return sDatabaseController; } public void addElement(Element element) { if (element != null) { ContentValues values = getContentValues(element); mDatabase.beginTransaction(); try { // insert element mDatabase.setTransactionSuccessful(); } finally { mDatabase.endTransaction(); } } } 

我已经提出了两个不同的Kotlin实现,但是他们都没有完全说服我。 哪一个可以被认为是更好的解决方案? 还是存在第三个更好?

首先使用对象实现

 object DatabaseControllerObject { private var mDatabase : SQLiteDatabase? = null fun initDatabase(context: Context) { mDatabase = mDatabase?: SQLiteOpenHelperImpl(context.applicationContext).writableDatabase } fun addElement(context: Context, element: Element) { initDatabase(context) // insert alarm mDatabase?.let { // CODE } } 

第二个实现在一个文件中的所有内容中,我需要在数据库的每个活动的onCreate()中调用initDatabase(..)

 private var mDatabase: SQLiteDatabase? = null fun initDatabase(context: Context) { mDatabase = mDatabase ?: SQLiteOpenHelperImpl(context.applicationContext).writableDatabase } fun addElement(element: Element) { val values = getContentValues(element) mDatabase?.let { it.beginTransaction() try { // insert it.setTransactionSuccessful() } finally { it.endTransaction() } } } 

One Solution collect form web for “Kotlin – 在Android中转换Singleton DatabaseController的最佳方法”

我想你想要的是伴侣对象:

 class DatabaseController { private constructor(context: Context) { // ... } companion object { private var instance: DatabaseController? = null fun getInstance(context: Context): DatabaseController { if(instance == null) { instance = DatabaseController(context) } return instance!! } } } 

那么你可以这样称呼它:

 val databaseController = DatabaseController.getInstance(context) 
  • 在处理kotlin中的getter和setter时出错
  • 与碎片的Kotlin
  • Kotlin:为什么我不能使用我的一个功能?
  • 为什么字符“-9223372036854775808”(最小64位有符号整数)不被kotlin接受?
  • 简化代码,除了签名以外,是相同的乐趣(可变参数vs地图)
  • 任何人都可以告诉我kotlin编译器是如何工作的? 它的架构是什么?
  • 在Kotlin中创建一个注释实例
  • 你如何声明一个使用Jackson XML的JsonTypeInfo.As.WRAPPER_OBJECT的多态字段?
  • 如何为Kotlin和Android设置Mockito
  • 一个简单的kotlin类与mockito测试引起MissingMethodInvocationException
  • 用Java + Mockito嘲笑Kotlin方法
  • Kotlin language will be the best programming language for Android.