←←←←←←←←←←←← 快,点关注!
最近Java与kotlin语言之争又有点小热,大概是因为某位当初吹捧Java的大神来华兜售其kotlin新书有关,但是与此同时相反观点也是不断涌现,Allegro团队就在他们的博客发表这篇文章,从Java到Kotlin,然后又回到Java的"折腾"过程。
我们过去尝试Kotlin,但现在我们正在用Java 10重写。
我有我最喜欢的一组JVM语言:Java是主打,Groovy用于测试,这是表现最好的二人组合。2017年夏季,我的团队开始了一个新的微服务项目,和往常一样,我们谈论了语言和技术。在Allegro有几个已经采用了Kotlin的团队,我们想尝试新兴事物,所以我们决定这次试一下Kotlin。由于Kotlin没有对应的Spock框架,我们决定还是使用Groovy /test (Spek不如Spock)。在2018年采取Kotlin几个月后,我们总结了正反优缺点,并得出Kotlin反而使我们的生产力下降的结论。我们开始用Java将这个微服务重写。
这是为什么呢?
从以下几个方面谈原因:
Name shadowing名称遮蔽
这是Kotlin让产生最大惊喜的地方。看看这个函数:
fun inc(num : Int) {
val num = 2
if (num > 0) {
val num = 3
}
println ("num: " + num)
}
<p>
当你调用inc(1)会输出什么呢?在Kotlin中,方法参数是不变的值,所以你不能改变num这个方法参数。这是很好的语言设计,因为你不应该改变方法输入参数。但是你可以用相同的名称定义另一个变量名并将其初始化为任何你想要的。现在在这个方法作用域中您有两个num命名的变量。当然,你一次只能访问其中一个num,但是num值是会被改变的。怎么办?
在if正文中,又再添加另一个num,这不太令人震惊(作用域是在块内)。
好的,在Kotlin中,inc(1)输出打印数字 “2”。
Java中的等效代码如下,但是无法通过编译:
void inc(int num) {
int num = 2; //error: variable 'num' is already defined in the scope
if (num > 0) {
int num = 3; //error: variable 'num' is already defined in the scope
}
System.out.println ("num: " + num);
}
<p>
名字遮蔽不是Kotlin发明的。这