为什么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
...
...
...
}
答案 0 :(得分:34)
Kotlin函数参数是最终的。没有val或final关键字,因为这是默认值(并且无法更改)。
答案 1 :(得分:4)
Kotlin M5.1 支持删除可变参数后,在早期版本中可以实现
fun foo(var x: Int) {
x = 5
}
根据Kotlin开发人员的说法,删除此功能的主要原因如下 -
主要原因是这令人困惑:人们倾向于认为这意味着通过引用传递参数,我们不支持这种参数(在运行时代价很高)。
混淆的另一个原因是主要构造函数:构造函数声明中的“val”或“var”表示如果函数声明(即,它创建属性),则与同一事物不同。
< / LI>另外,我们都知道变异参数不是好的样式,所以在函数中写一个参数的“val”或“var”,不再允许使用for循环的catch块。
摘要 - 现在所有参数值均为val
。您必须引入单独的变量进行重新初始化。示例 -
fun say(val msg: String) {
var tempMsg = msg
if(yourConditionSatisfy) {
tempMsg = "Hello To Me"
}
}
答案 2 :(得分:0)
另一个原因是val和var仅相差一个字母。这可能非常令人困惑。因此,对于功能参数,他们完全删除了该选项。从而消除了这一小区域中的混乱(但仍将其保留在其他地方-如图)。
答案 3 :(得分:0)
做出这个决定是为了避免 fragile 基类问题。它发生在基类(超类)中的微小变化导致子类发生故障时。