代码之家  ›  专栏  ›  技术社区  ›  HelloCW

当我试图优化kotlin中的init语句时,在哪里可以添加try{…}代码?

  •  0
  • HelloCW  · 技术社区  · 6 年前

    我发现代码A中有一些冗余代码,似乎不需要使用in i t语句。

    所以我试着把它优化成代码B,但是我不知道如何添加 try {...} 在代码B中,您知道有必要将错误写入日志,如何添加 try{...} catch (e:Exception){...} 在代码B中?谢谢!

    代码A

    class DetailsHandler(mContext: Context = UIApp.instance) {
    
        var mJson: String by PreferenceTool(mContext, mContext.getString(R.string.SavedJsonName), "")
        private var listofMDetail: MutableList<MDetail>?=null
    
        init {
            try{
                listofMDetail = myGson.fromJson<MutableList<MDetail>>(mJson) 
            }catch(e:Exception) {
                e.message?.let{ logError("Paser: "+it)}
            }
        }
    }
    

    代码B

    class DetailsHandler(mContext: Context = UIApp.instance) {
        var mJson: String by PreferenceTool(mContext, mContext.getString(R.string.SavedJsonName) , "")
        private var listofMDetail: MutableList<MDetail>?= myGson.fromJson<MutableList<MDetail>>(mJson)
    }
    

    致沃丹:

    谢谢!

    listofMDetail 当它来自 myGson.fromJson(mJson)

    所以我必须定义 列表详细信息 如果我想利用这个乐趣 addDetail 是的。我需要分配 mutableListOf(aMDetail) 列表详细信息 什么时候 列表详细信息 是空的。

    你有更好的方法吗?

    fun addDetail(aMDetail:MDetail){
       if (listofMDetail==null){
           listofMDetail=mutableListOf(aMDetail)
       }else {
           listofMDetail?.add(aMDetail)
       }
    
        mJson =myGson.toJson(listofMDetail) //Save
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   voddan    6 年前

    只需使用 try 块作为表达式。然后你就可以 var 进入之内 val 是的。

    class DetailsHandler(mContext: Context = UIApp.instance) {
    
        val mJson: String by PreferenceTool(mContext, mContext.getString(R.string.SavedJsonName), "")
    
        private val listofMDetail: MutableList<MDetail>? = 
            try{
                myGson.fromJson(mJson) 
            }catch(e:Exception) {
                e.message?.let{ logError("Paser: "+it)}
                null
            } 
    }
    

    另外,我不建议记录异常并在 listofMDetail 是的。它将使所有其他使用的代码复杂化。抛出异常似乎是一个更合适的解决方案:

        private val listofMDetail: MutableList<MDetail> = 
            try{
                myGson.fromJson(mJson) ?: mutableListOf()
            }catch(e:Exception) {
                e.message?.let{ logError("Paser: "+it)}
                throw RuntimeError(e)
            }
    

    有点重构的代码:

        private val listofMDetail: MutableList<MDetail> = 
            try{
                myGson.fromJson(mJson) ?: mutableListOf()
            } catch(e: Exception) {
                logError("Can't find $mJson in $myGson; Error: ${e.message}")
                mutableListOf()
            }
    
        2
  •  0
  •   Vir Rajpurohit    6 年前

    你可以这样做

    class DetailsHandler(mContext: Context = UIApp.instance) 
    {
    Private var listofMDetail: MutableList<MDetail> = mutableListOf()
    var mJson: String by PreferenceTool(mContext, mContext.getString(R.string.SavedJsonName) , "")
         try {
            listofMDetail: MutableList<MDetail>?= myGson.fromJson<MutableList<MDetail>>(mJson)
            }catch (e:Exception) 
            {  
             e.message?.let{ logError("Paser: "+it)}
            }
    
        }