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() } } } 

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

 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)