硬币的另一面:
我对 Scala 没有丰富的经验。我已经编写了大约 10,000 行 Scala 代码。但是,考虑到 Scala 代码通常比它粗略的 40,000 行 Java 代码要短得多。
简而言之,我根本不喜欢 Scala。我喜欢它的目标和想法,但对于生产用途,我认为这些想法的实施过于大胆,有时甚至是愚蠢的。我的信念是 Scala 代码很难以健壮和清晰的方式编写。有太多的概念经常因副作用而重叠,如果你不是专家,这会让你的生活变得非常艰难。有一种观点认为,只要不使用这些结构,就可以避免这些问题。我拒绝这种观点,因为如果您想避免有问题的事情,您必须知道您并不完全理解这些功能,这需要专业知识。我的信念是,Scala 语言的实现适合一所应该测试新概念的大学,而这正是 Scala 所发生的。有很多例子,
- Java 泛型不完整主要是因为类型擦除,每个人都同意这一点。Scala 使用公共 API 至少以三种方式“解决”了这些问题:Manifest、TypeTag、ClassTag。在我看来,这意味着问题根本没有解决,或者如果解决了,某些解决方案就足够错误了。
- 转换器是我认为有问题的功能的一个示例:一个简单的删除类型之间的强连接与柔软的东西,很容易被遗漏。在我开始使用第三方库之后,一些勇敢的人使用了很多第三方库,我的代码开始表现得很奇怪。我输入了一些错误,恰好被转换器覆盖并花了几个小时进行调试。
- 带默认值的参数:可以定义带默认值的参数的方法;这很有用,主要是因为使用命名参数可以避免编写许多方法......直到您发现不能同时拥有两个方法都具有具有相同名称的默认值参数的那一刻。
现在我不想发动战争,远非如此。Scala 有很多奇妙的想法,Java 陈旧,缺乏很多东西。但对于生产,我总是选择 Java。
稍后编辑:
有关 Scala 类型擦除的更多详细信息,请参阅此处的简短评论。
为了澄清我对参数值的陈述,我只是举了一个假设的例子(所以像 Array 和 List 这样的反对实现了一些可遍历的接口不算在内):
class Plot {
def histogram(x: Array[Double], bins: Int = 30): String = "test1"
def histogram(x: List[Double], bins: Int = 30): String = "test2"
}
上面的代码无法编译:错误:在类 Plot 中,方法 f 的多个重载替代定义了默认参数。
类型擦除清单和类型标签/
后来的另一个编辑
我收到了一个编辑建议,因为我不知道如何给投稿人发消息,所以我会在这里回答。他的想法是代码不正确,应该如下所示。
def histogram(x: Array[Double], bins: Int = 30): String = {
var r = "test1"
return r;
}
据我所知,这和上面的一样,因为我的版本是一个快捷方式。关键是代码无法编译,因为您在两个方法中有一个具有相同名称的默认值的参数,而不是因为没有正确声明方法。显然,就像在许多其他语言中一样,可以找到其他方法来解决这个问题。
整个想法是,对我来说,Scala 看起来像是一种过于慷慨的语言,有很多方法可以做很多事情,这会产生复杂性负担。在上下文中,拥有像我提到的那样的功能,它使事情变得更加困难。显然我不拥有真相,所以我冒昧地避免语言的复杂性,集中精力解决实际问题,其他任何人都可以自由地用这种语言解决它的问题。恕我直言。