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

这是非常糟糕的做法使用!!在科特林?

  •  1
  • lannyf  · 技术社区  · 7 年前

    最近有一些讨论关于是否!!应在kotlin代码中使用。一种观点认为根本不应该使用它,因为这对kotlin来说是一种不好的做法,会增加撞车的风险。

    另一种意见认为使用!!这并不是一件绝对的坏事,只要您知道在任何已知条件下,可为null的数据不应该为null!!只是一个安全防护装置(如果它在不应该出现的位置意外变为空!!将捕获它并引起关注,那么它肯定需要进行调查)。不应该考虑使用!!是撞车的原因之一。

    下面的两个示例,看不到数据计数_2会更好,或者?

    var data: List<Data>? = null  // it will be set before calling the two dataCount()
    
    fun dataCount_1() : Int {
        return if (data!=null && data!!.isNotEmpty())  data!![0].count else 0
    }
    
    fun dataCount_2() : Int {
    
        data?.let { dataList ->
            if (dataList.isNotEmpty()) {
                return dataList[0].count ?: 0
            }
        }
        return 0
    }
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   yole    7 年前

    在这种情况下,有多种惯用方式来表达想法而不使用 !! ,所以最好不要使用它。下面是我将要做的(使用 orEmpty

    fun dataCount() = data.orEmpty().firstOrNull()?.count ?: 0
    

        2
  •  3
  •   EpicPandaForce Jigar Joshi    7 年前

    实际上,在这种情况下,最简单、最安全的方法是这样做:

    var data: List<Data>? = null  // it will be set before calling the two dataCount()
    
    fun dataCount() : Int {
        val data = data
        return when {
            data == null || data.isEmpty() -> 0
            else -> data[0].count
        }
    }
    

    虽然我个人只会使用 run 使其成为单行函数。

    fun dataCount() : Int = run {
        val data = data
        when {
            data == null || data.isEmpty() -> 0
            else -> data[0].count
        }
    }
    

    但那可能只是我。

    val ?.let { 在第二个示例中),则可以利用智能铸造,而无需使用 !! .

        3
  •  2
  •   gidds    7 年前

    !! dataCount_1() ,在显式空检查之后,编译器知道 data

    因此,虽然有极少数情况下 !!

    (此外,在这种情况下,您还可以做两个进一步的更改:使用 lateinit var,这同样不需要任何 ; 并将整个条件替换为更简洁的条件 .isNotNullOrEmpty() .)

    你伸手去拿的时间 !! ,有更好的方法。但我不会完全禁止它:如果你仔细考虑了所有的替代方案,仍然这么认为 是最清楚最安全的方法,然后继续。

        4
  •  0
  •   Vino    6 年前

    我宁愿使用 requireNotNull() IllegalStateException 如果论点是正确的 null .

    推荐文章