final或val函数参数还是在Kotlin中?

时间:2016-11-12 13:36:26

标签: kotlin

为什么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
    ...
    ...
    ...
}

4 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:4)

Kotlin M5.1 支持删除可变参数后,在早期版本中可以实现

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

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

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

  2. 混淆的另一个原因是主要构造函数:构造函数声明中的“val”或“var”表示如果函数声明(即,它创建属性),则与同一事物不同。

    < / LI>
  3. 另外,我们都知道变异参数不是好的样式,所以在函数中写一个参数的“val”或“var”,不再允许使用for循环的catch块。

  4. 摘要 - 现在所有参数值均为val。您必须引入单独的变量进行重新初始化。示例 -

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

答案 2 :(得分:0)

另一个原因是val和var仅相差一个字母。这可能非常令人困惑。因此,对于功能参数,他们完全删除了该选项。从而消除了这一小区域中的混乱(但仍将其保留在其他地方-如图)。

答案 3 :(得分:0)

做出这个决定是为了避免 fragile 基类问题。它发生在基类(超类)中的微小变化导致子类发生故障时。