kotlin val的一次錯誤運用

kotlin val的一次錯誤運用

由於kotlin中被val或var修飾成員自帶getter()/setter()(被val 修飾的成員沒有setter()),所以在定義變量名稱的時候不再像Java那樣在成員變量之前加入小寫m,類似於mApplication;所以一段時間不曾在代碼裏看到getXXX或setXXX出現,所以有一下代碼出現:

    private var page = 1
    private val userModel = UserModel.instance
    private val statementModel by lazyNone { StatementModel() }
    var isRefresh = false
        private set
    val nextPage = statementModel.getPage(userModel.scholar, ++page)

注意以上代碼中的nextPage,它的本意是調用nextPage然後獲取下一頁的數據,但是我卻忽略了被val 修飾的成員並不能綁定一個函數,val 成員可以綁定一個lambda對象,以此來讓它表現出類似於函數的效果,且調用方式也類似,例如:

     val nextInt={  ++page}
     val value=nextInt()

但是 nextInt 任然是一個對象,只不過是比較特殊點的lambda對象罷了。所以在開頭提到的代碼中,利用val 修飾的成員來綁定函數是一個錯誤的行爲,但爲什麼編譯器沒有提示出錯呢,問題正是出在了statementModel.getPage(userModel.scholar, ++page)函數返回了一個對象而不是Unit,所以val 成員只是引用了該函數第一次運行的結果,由於返回的對象也非lambda對象,自然也不能像函數那樣調用,所以正確的寫法應該是如下所示:

    private var page = 1
    private val userModel = UserModel.instance
    private val statementModel by lazyNone { StatementModel() }
    var isRefresh = false
        private set
    fun nextPage() = statementModel.getPage(userModel.scholar, ++page)

出現這個問題是由於對被val修飾成員的理解出現偏差,故記錄之。

寫於2018/11/28

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章