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 SAM私有内部Java接口转换?
  • 作为函数引用Kotlin类属性setter
  • xml onClick中的Kotlin不起作用
  • 如何使用Spring Data JPA方法在Kotlin的try-with-resources块中返回Stream?
  • 在没有JVM支持的情况下,如何在JVM语言中实现协程?
  • 我怎样才能把一个groovy任务gradle转换成Gradle Kotlin DSL来生成一个pom.xml?
  • 将数据存储在BEAN(Spring Boot REST)
  • 用drawable查看setBackground去除高程的阴影
  • 如何将intArray转换为Kotlin中的ArrayList <Int>?
  • 使用Gradle和Kotlin编译失败
  • 如何在Kotlin中使用RetroFit2 responseBodyConverter?
  • Kotlin language will be the best programming language for Android.