【问题标题】:final or val function parameter or in Kotlin?final 或 val 函数参数或在 Kotlin 中?
【发布时间】:2016-11-12 13:36:26
【问题描述】:

为什么 Kotlin 去掉了 Java 中非常有用的 final 或 val 函数参数?

fun say(val msg: String = "Hello World") {
    msg = "Hello To Me" // would give an error here since msg is val    
                        //or final
    ...
    ...
    ...
}

【问题讨论】:

  • 希望某样东西,然后发现它已经存在,这很好,不是吗? :)
  • 哈哈,你说得对。
  • 我使用的是 kotlin 版本 1.3.31,它不允许我将 var 作为函数参数

标签: kotlin


【解决方案1】:

Kotlin 函数参数是最终的。没有 val 或 final 关键字,因为这是默认值(并且无法更改)。

【讨论】:

【解决方案2】:

Kotlin M5.1对可变参数的支持移除后,在早期版本中可以使用

实现
fun foo(var x: Int) {
  x = 5
}

根据 Kotlin 开发人员的说法,删除此功能的主要原因如下 -

  1. 主要原因是这令人困惑:人们倾向于认为这意味着通过引用传递参数,我们不支持这种做法(运行时代价高昂)。

  2. 另一个混淆来源是主构造函数:构造函数声明中的“val”或“var”与函数声明(即,它创建一个属性)时的同一事物不同。

  3. 另外,我们都知道修改参数是不好的风格,所以在函数的参数前面写“val”或“var”,for循环的catch块是不允许的。

总结 - 现在所有参数值都是val。您必须引入单独的变量来重新初始化。示例 -

fun say(val msg: String) {
    var tempMsg = msg
    if(yourConditionSatisfy) {
       tempMsg = "Hello To Me"
    }
}

【讨论】:

  • @DanielWilson 我不确定您遵循什么准则。但通常我在前面的变量名中附加 temp 。或者更好的是你可以建议编辑。
【解决方案3】:

另一个原因是 val 和 var 仅相差一个字母。这可能非常令人困惑。因此,对于函数参数,他们完全删除了该选项。从而消除了这一小区域的混乱(但在其他任何地方都保留了它——去看看)。

【讨论】:

    【解决方案4】:

    做出这个决定是为了避免fragile 基类问题。当基类(超类)的微小变化导致子类出现故障时,就会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多